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

时间:2011-07-10 21:28:30

标签: xslt

我有一个像这样的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的父节点的所有属性。

2 个答案:

答案 0 :(得分:2)

  

我想知道怎样才能获得父节点的所有属性,即TestCase

您可能需要XPath ancestor-or-self轴:

ancestor-or-self::TestCase/@Name
  

如何连接父节点的attribte名称

这实际上取决于模板上下文和您正在处理的代码。以你的片段作为参考,我会写得更好:

<xsl:template match="TestCase[Variation]">
    <xsl:for-each select="ancestor-or-self::TestCase/@Name">
        <xsl:value-of select="concat(.,' ')"/>
    </xsl:for-each>
</xsl:template>

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

答案 1 :(得分: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(.)

在上面的XML文档上进行评估时,上面的XPath 2.0表达式产生了所需的正确结果

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>