我有一些看起来像这样的XML;
<Root attr1="ABC">
<Element1>
<Element2>
<Element3 />
</Element2>
<Element2>
<Element3 />
</Element2>
<Element1>
</Root>
我有一些处理此问题的XSLT,由于某种原因,它将Root节点称为“Root”(没有引号)。
我现在处于一个我将拥有一些结构相同的XML的位置,除了例如调用Root节点。我不想要两个版本的XSLT,所以我可以更通用的方式引用根节点。
作为我的意思的一个例子......
<xsl:when test="/Root/@attr1 = 'ABC'">
我需要这个也适用于
<xsl:when test="/NewRoot/@attr1 = 'ABC'">
我在关于这个主题的阅读中已经注意到需要注意确保引用是根节点,而不是Document元素,后者我假设是XML的这一部分
<?xml version="1.0" encoding="UTF-8"?>
任何帮助都是值得赞赏的。
由于
答案 0 :(得分:2)
我能以更通用的方式引用根节点吗?
只需使用:
/*/@attr1 = 'ABC'
这恰好产生true()
时,XML文档的顶部元素(无论其名称)是否具有名为attr1
的属性,其字符串值为字符串:&#34; ABC&#34;
我们在这里使用这样一个事实:格式良好的XML文档必须只有一个顶级元素 - 因此我们不需要编写:/*[1]
答案 1 :(得分:1)
我建议使用例如。
<xsl:template match="/Root | /NewRoot">
<xsl:if test="@attr1 = 'ABC'">...</xsl:if>
</xsl:template>
或者将属性检查也放到模板匹配模式中甚至可能更好,例如。
<xsl:template match="/Root | /NewRoot">
<xsl:apply-templates select="@*"/>
</xsl:template>
<xsl:template match="/Root/@attr1[. = 'ABC'] | /NewRoot/@attr1[. = 'ABC']">
<!-- now output here what you want to output if the condition is met -->
</xsl:template>
如果您确实需要使用xsl:when
test
完整路径,请使用test="/Root/@attr1 = 'ABC' or /NewRoot/@attr1 = 'ABC'"
。