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