我有xml:
<msg id="abc" type="test">
<local id="def"/>
<cnts x:type="fld" id="111" type="a2">
</cnts>
</msg>
xslt是:
<xsl:template match="contents[@x:type='fld']">
<xsl:variable name="msgs">
<xsl:for-each select="ancestoer::msg">
<msg><xsl:value-of select="@type"/></msg>
</xsl:for-each>
</xsl:variable>
</xsl:template>
我希望输出为:
<msg>test</msg>
但它没有按预期工作。有人可以帮忙吗?
答案 0 :(得分:1)
您的XSLT和XML存在一些问题,每个问题可能是也可能不是您的问题的原因:
contents
不在您的XML中(您的意思是cnts
吗?)。xsl:stylesheet
元素中也无法编译,ancestoer::msg
会引发编译时(静态)错误。msg
,不确定这是故意的如果以上所有内容在您的实际XSLT中都是正确的,那么您的问题就在其他地方,我们将不得不看到更多您的XSLT 和 XML,事实上,我们需要一个Minimal, Complete, and Verifiable example。
也就是说,这里有三种使用祖先轴的方法:
<xsl:value-of select="ancestor::msg/@type" />
。如果要循环遍历所有祖先,可以使用:
<xsl:template match="contents[@x:type='fld']">
<xsl:apply-templates select="ancestor::msg" mode="anc" />
</xsl:template>
<xsl:template match="msg" mode="anc">
<msg><xsl:value-of select="@type" /></msg>
</xsl:message>
在这个例子中,我故意切换模式,因为你很可能已经在其他地方的msg
匹配,在这种情况下,你可能会以一个永无止境的循环结束。
xsl:for-each
的方法。这没有错,只是不那么灵活,从长远来看更多的打字。不需要使用变量,但如果您想使用变量,请确保您也使用变量,例如使用xsl:copy-of
。