我尝试使用XPath / XSLT将节点添加到满足特定要求的现有节点:
在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替换*它可以正常工作,但我需要匹配任何名称的节点。
答案 0 :(得分:2)
*
应该可以正常工作。但是您在示例中与元素Typename
而不是Type
匹配,请尝试以下操作:
*[@id][Type='Identifier']
或者:
*[@id and (Type='Identifier')]
答案 1 :(得分:1)
您的模板匹配正在寻找后代Typename
元素,您想要查找Type
元素。
此外,您当前正在匹配后代,但您的问题和模板逻辑正在寻找子元素。
您应该将模板匹配调整为:
*[@id][Type='Identifier']