Xml 如何在XSLT中获取祖先轴上的属性
我有xml:Xml 如何在XSLT中获取祖先轴上的属性,xml,xslt,Xml,Xslt,我有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"> <xs
<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>
测试
但它并没有像预期的那样起作用。有人能帮忙吗?您的XSLT和XML有几个问题,每一个问题都可能是问题的原因,也可能不是问题的原因:
contents
匹配(您的意思是cnts
?)xsl:stylesheet
元素中,也不可能编译,antestore::msg
将引发编译时(静态)错误msg
,但不确定这是有意的
<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
一起使用输入XML有一个元素
cnts
,它与XSLT中的contents
不同。你为什么要那样做?更新XML以使其完整。有一个变量来存储一些值并不会输出它,请向我们展示您的完整XSLT!!而且,轴的拼写是祖先
!!我在最后一刻更改了属性名,但忘记在XSLT中更改它。xslt中的变量确实用于其他地方。谢谢你的回答,亚伯!