Я пытаюсь использовать XPath / XSLT для добавления узла к существующему узлу, который удовлетворяет определенным требованиям:
- Узел имеет атрибут "id"
- Узелимеет дочерний элемент с именем «Type», содержащий заданный текст, например «Identifier»
В 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>
У меня возникают трудности при написании соответствияВыражение для этого, моя «лучшая» попытка:
<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>
Если я заменим * на имя узла, он будет работать нормально, но мне нужно сопоставить узлы с любым именем.