0

我有一些看起来像这样的 XML;

<Root attr1="ABC">
    <Element1>
        <Element2>
             <Element3 />    
        </Element2>
        <Element2>
             <Element3 />    
        </Element2>
    <Element1>
</Root>

我有一些 XSLT 可以处理这个问题,出于某种原因,它将根节点引用为“根”(不带引号)。

我现在处于一个我将拥有一些相同结构的 XML 的位置,除了例如调用 Root 节点。我不想要我的 XSLT 的两个版本,所以我可以以更通用的方式引用根节点。

作为我的意思的一个例子......

<xsl:when  test="/Root/@attr1 = 'ABC'">

我需要这个也为

<xsl:when  test="/NewRoot/@attr1 = 'ABC'">

我在阅读该主题时注意到,需要注意确保引用是根节点,而不是 Document 元素,我认为后者是 XML 的这一部分

<?xml version="1.0" encoding="UTF-8"?>

任何帮助都将一如既往地受到赞赏。

谢谢

4

2 回答 2

2

我可以以更通用的方式引用根节点吗?

只需使用

/*/@attr1 = 'ABC'

true()当 XML 文档的顶部元素(无论其名称如何)具有名为 的属性attr1,其字符串值为字符串:“ABC”时,这将准确产生。

这里我们使用了一个格式良好的 XML 文档必须只有一个顶部元素这一事实——因此我们不需要编写:/*[1]

于 2013-05-01T15:29:45.933 回答
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'".

于 2013-05-01T14:01:59.970 回答