как объединить имена атрибутов родительских узлов - PullRequest
4 голосов
/ 11 июля 2011

У меня есть 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 ]

2 голосов
/ 11 июля 2011

Это преобразование :

<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>
2 голосов
/ 11 июля 2011

Интересно, как я могу получить все атрибуты родительских узлов 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>

Это выведет искомую строку, начиная с узла TestCase, у которого узел Variation является дочерним.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...