使用XSL / XPath将节点与具有给定属性和子节点的任何名称进行匹配

时间:2011-05-11 10:41:52

标签: xslt xpath

我尝试使用XPath / XSLT将节点添加到满足特定要求的现有节点:

  • 该节点具有属性" id"
  • 该节点有一个名为" Type"的子节点,包含给定的文本,例如"标识符"

在XML中匹配:

  <SomeRandomNode>
    <Type>SomeRandomType</Type>
    <Child>
      <Count type="int32">2</Count>       
      <!-- This node should be matched -->
      <Key id="5">
        <Type>Identifier</Type>
        <SomeValue type="string">Hello</SomeValue>
        <SomeOtherValue type="string">World</SomeOtherValue>
      </Key>
    </Child>
  </SomeRandomNode>
</Project>

我很难为此写一个匹配表达式,我的&#34;最好的&#34;尝试:

<xsl:template match="*[@id][.//Typename='Identifier']"> 
  <xsl:copy>
    <xsl:attribute name="id">
      <xsl:value-of select="@id"/>
    </xsl:attribute>

    <!-- Copy nodes -->
    <xsl:copy-of select="Type" />
    <xsl:copy-of select="SomeValue" />
    <xsl:copy-of select="SomeOtherValue" />
    <!-- Add new -->
    <NewValue type="string">This node was added</NewValue>
  </xsl:copy>
</xsl:template>

如果我用nodename替换*它可以正常工作,但我需要匹配任何名称的节点。

2 个答案:

答案 0 :(得分:2)

*应该可以正常工作。但是您在示例中与元素Typename而不是Type匹配,请尝试以下操作:

*[@id][Type='Identifier']

或者:

*[@id and (Type='Identifier')]

答案 1 :(得分:1)

您的模板匹配正在寻找后代Typename元素,您想要查找Type元素。

此外,您当前正在匹配后代,但您的问题和模板逻辑正在寻找子元素。

您应该将模板匹配调整为:

*[@id][Type='Identifier']