XSLT没有产生预期的输出

时间:2014-02-08 14:47:50

标签: xslt xslt-1.0

输入XML:

<derivatives>
    <derivative id="4" name="Audio Content">

        <operator id="1" name="Reliance">
            <referenceCode code="62033815">
                <mobileCircle id="1" name="Maharashtra"/>
            </referenceCode>
        </operator>

        <operator id="22" name="Aircel">
            <referenceCode code="811327">
                <mobileCircle id="1" name="Maharashtra"/>
            </referenceCode>
        </operator>

    </derivative>
</derivatives>

预期输出XML:

<hellotune>
    <operator>Aircel</operator>
    <vcode>811327</vcode>
</hellotune>

当前输出(错误):

<hellotune>
    <operator>Aircel</operator>
    <vcode/>
</hellotune>

XSL(无法正常工作):

<xsl:if test="derivatives/derivative/operator[@name='Aircel']">
    <hellotune>
        <operator>Aircel</operator>
        <vcode><xsl:value-of select="referenceCode/@code"/></vcode>
    </hellotune>
</xsl:if>

注意:使用XSL v1.0。为简洁起见,没有提到完整的XSL。

2 个答案:

答案 0 :(得分:0)

根据您提供的XSL,可以假设上下文节点是根节点,但是从根节点开始,路径referenceCode/@code与输入中的任何内容都不匹配。在该路径之前附加derivatives/derivative/operator/将成功找到referenceCode @code属性,但它会找到错误的属性。尝试这种推式方法:

<xsl:template match="/">
  <xsl:apply-templates select="derivatives/derivative/operator[@name='Aircel']" />
</xsl:template>

<xsl:template match="operator">
    <hellotune>
        <operator><xsl:value-of select="@name" /></operator>
        <vcode><xsl:value-of select="referenceCode/@code"/></vcode>
    </hellotune>
</xsl:template>

答案 1 :(得分:0)

元素<vcode>中的xpath xpression不是指输入文档中的任何节点。匹配所有节点的最佳方法是使用

  

//

就像你的代码一样,你可以使用

  

// referenceCode / @代码   (但这仅用于信息目的,使用相同的方法无法获得结果)。

你可以这样试试:

<xsl:template match="/">

<hellotune>
    <xsl:for-each select="//operator">
            <xsl:if test="./@name='Aircel'">
                <operator><xsl:value-of select="@name"/></operator>
                <vcode><xsl:value-of select="referenceCode/@code"/></vcode>
            </xsl:if>
        </xsl:for-each>
</hellotune>
</xsl:template>

希望这会有所帮助:)