输入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。
答案 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>
希望这会有所帮助:)