如何连接父节点的属性名称

4

我有一个像这样的XML文档:

<Module Name="DacInPlaceUpgradeLtmTest" Desc="" >
 <TestCase Name="ExecuteInPlaceUpgradeTest">
  <TestCase Name="BugRepro">
   <TestCase Name="295130">
      <Variation Id="1" Desc="Sql - EmptyAlterScript">
      <Variation Id="2" Desc="Sql - EmptyDatabase">
   </TestCase>
  </TestCase>
 </TestCase>
</Module>

我使用XSL获取一个值:
ExectionInplaceUPgradeTest BugRepro 295130 

通过使用以下模板:
 <xsl:template match="TestCase//Variation">
    <xsl:for-each select="..@Name">

今天,我只能获取295130,我想知道如何获取所有TestCase父节点的属性。

似乎你只是在寻找一个简单的XPath。请看我的回答。 - Emiliano Poggi
1
好问题,+1。请查看我的答案,其中包含两个完整、简短和易于实现的解决方案(XSLT 1.0 和 XPath 2.0 / XSLT 2.0)。 - Dimitre Novatchev
2个回答

3
我想知道如何获取所有父节点TestCase的属性。
您可能需要使用XPath中的“ancestor-or-self”轴:
ancestor-or-self::TestCase/@Name

如何拼接父节点的属性名称
这取决于模板上下文和您已经在工作的代码。以您的片段为参考,我会写得更好:
<xsl:template match="TestCase[Variation]">
    <xsl:for-each select="ancestor-or-self::TestCase/@Name">
        <xsl:value-of select="concat(.,' ')"/>
    </xsl:for-each>
</xsl:template>

这将打印从具有Variation节点作为子节点的TestCase节点开始的所需字符串。


2

这个转换:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="text"/>

 <xsl:template match="Variation[@Id = 1]">
  <xsl:apply-templates mode="printName"
   select="ancestor::TestCase"/>
 </xsl:template>

 <xsl:template match="TestCase" mode="printName">
  <xsl:if test="not(position()=1)">
   <xsl:text> </xsl:text>
  </xsl:if>
  <xsl:value-of select="@Name"/>
 </xsl:template>

 <xsl:template match="text()"/>
</xsl:stylesheet>

应用于提供的XML文档时

<Module Name="DacInPlaceUpgradeLtmTest" Desc="" >
    <TestCase Name="ExecuteInPlaceUpgradeTest">
        <TestCase Name="BugRepro">
            <TestCase Name="295130">
                <Variation Id="1" Desc="Sql - EmptyAlterScript"/>
                <Variation Id="2" Desc="Sql - EmptyDatabase"/>
            </TestCase>
        </TestCase>
    </TestCase>
</Module>

产生所需的、正确的结果:

ExecuteInPlaceUpgradeTest BugRepro 295130

II. XPath 2.0/XSLT 2.0 解决方案

//TestCase[Variation]
       /ancestor-or-self::TestCase
          /@Name/string(.)

当上述XPath 2.0表达式在上述XML文档中进行评估时,将产生完全所需的正确结果

ExecuteInPlaceUpgradeTest BugRepro 295130

它可以用于以下XSLT 2.0解决方案::

<xsl:stylesheet version="2.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="text"/>

 <xsl:template match="/">
  <xsl:sequence select=
  "//TestCase[Variation]
       /ancestor-or-self::TestCase
          /@Name/string(.)
  "/>
 </xsl:template>
</xsl:stylesheet>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接