xsl-list
[Top] [All Lists]

looping

2003-06-22 17:24:42
Attached below is the XML and the XSL files. I would like to print the
attribute values of all tags inside the inner <HSDataContainerType> tag for
inputs as well as outputs such as licenceKey, fromCurrency etc. With my XSL
it only prints the first attribute value. How can print them all?

I want to use a loop to achieve this since i would not know the number of
inputs/outputs everytime.

Thanks in advance-

Ahsan

XML:

<HSContract contractName="ConvertToNum">
        <HSDataContainerType name="Inputs">
                <HSDataContainerType name="ConvertToNum">
                        <HSString name="licenseKey" xmlNodeType="1" />
                        <HSString name="fromCurrency" xmlNodeType="1" />
                        <HSString name="toCurrency" xmlNodeType="1" />
                        <HSDouble name="amount" required="true" xmlNodeType="1" 
/>
                        <HSBoolean name="rounding" required="true" 
xmlNodeType="1" />
                </HSDataContainerType>
        </HSDataContainerType>
        <HSDataContainerType name="Outputs">
                <HSDataContainerType name="ConvertToNumResponse">
                        <HSDouble name="ConvertToNumResult"/>
                        <HSBoolean name="roundingResult" required="true" 
xmlNodeType="1" />
                </HSDataContainerType>
        </HSDataContainerType>
</HSContract>

XSL:

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform";>
<xsl:template match="HSDataContainerType/HSDataContainerType">
        <!-- if(parent's attribute is Input, print it) -->
        <xsl:if test="contains(../@name, 'Inputs')">
                <b><p><xsl:value-of select="../@name"/>:</p></b>

                <xsl:comment>loop thru all elements in 'Inputs'</xsl:comment>

                <xsl:for-each select=".">
                        <!-- if the child node is an HSString, print its name 
-->
                        <xsl:if test="contains(name(child::*), 'HSString')">
                                <xsl:comment>print child's attrib!</xsl:comment>
                                <xsl:value-of select="./HSString/@name"/>
                        </xsl:if>
                        <!-- if the child node is an HSString, print its name 
-->
                        <xsl:if test="contains(name(child::*), 'HSDouble')">
                                <xsl:comment>print child's attrib!</xsl:comment>
                                <xsl:text>HERE!</xsl:text>
                                <xsl:value-of select="./HSDouble/@name"/>
                        </xsl:if>
                        <!-- if the child node is an HSString, print its name 
-->
                        <xsl:if test="contains(name(child::*), 'HSBoolean')">
                                <xsl:comment>print child's attrib!</xsl:comment>
                                <xsl:text>HERE!</xsl:text>
                                <xsl:value-of select="./HSBoolean/@name"/>
                        </xsl:if>
                </xsl:for-each>
        </xsl:if> <!-- inputs ends here -->

        <xsl:comment>if parent's attrib is Outputs, print it!</xsl:comment>
        <xsl:if test="contains(../@name, 'Outputs')">
                <b><p><xsl:value-of select="../@name"/>:</p></b>
        </xsl:if>

</xsl:template>
</xsl:stylesheet>

Is there a way to print a child's attribute value w/o knowing the name of
child? In this case i have to first check if its an HSString then i can
print: <xsl:value-of select="./HSString/@name"/> ??



 XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list



<Prev in Thread] Current Thread [Next in Thread>
  • looping, Ahsan <=