Использование XSL / XPath для сопоставления узлов с любым именем, имеющим заданный атрибут и дочерний узел - PullRequest
1 голос
/ 11 мая 2011

Я пытаюсь использовать 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>

Если я заменим * на имя узла, он будет работать нормально, но мне нужно сопоставить узлы с любым именем.

Ответы [ 2 ]

2 голосов
/ 11 мая 2011

* должно работать нормально. Но вы сравниваете элемент Typename вместо Type в вашем примере, поэтому попробуйте это:

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

Или:

*[@id and (Type='Identifier')]
1 голос
/ 11 мая 2011

Ваш шаблон ищет искомые Typename элементы, вы хотите найти Type элементы.

Кроме того, в настоящее время вы подходите для потомков, но ваш вопрос и логика шаблона ищут дочерние элементы.

Вы должны настроить соответствие шаблона на:

*[@id][Type='Identifier']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...