Xml 如何在XSLT中获取祖先轴上的属性

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

我有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>
测试

但它并没有像预期的那样起作用。有人能帮忙吗?

您的XSLT和XML有几个问题,每一个问题都可能是问题的原因,也可能不是问题的原因:

  • 您的XSLT还不完整,您这样做可能是为了节省空间,但这使得猜测错误(名称空间绑定、应用模板等)变得更加困难
  • 您的XML与XSLT不匹配,如注释中所述,模板与XML中不存在的元素
    contents
    匹配(您的意思是
    cnts
    ?)
  • 您的代码段,即使包装在有效的
    xsl:stylesheet
    元素中,也不可能编译,
    antestore::msg
    将引发编译时(静态)错误
  • 代码段定义了一个变量,但没有使用它,因此变量中的内容将不可见
  • 您似乎想要在祖先轴上循环,这可能会选择多个元素
    msg
    ,但不确定这是有意的
  • 如果上述所有内容在实际的XSLT中都是正确的,那么问题就出在其他地方,我们将不得不更多地了解XSLT和XML,事实上,我们需要一个解决方案

    也就是说,这里有三种使用祖先轴的方法:

  • 如果只需要一项,则不需要中间变量,只需使用
  • 如果要在所有祖先上循环,可以使用:

    <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中的变量确实用于其他地方。谢谢你的回答,亚伯!