Эффективный код для замены текстового узла другим текстом с использованием XSLT? - PullRequest
1 голос
/ 27 января 2010

У меня есть XML, где текстовый узел со значением «нулевой тег» появляется (случайным образом) в разных местах файла.
Мой вопрос состоит в том, как заменить текст другим текстом, где имя элемента (и родительского узла) неизвестно . Я уже создал файл XSLT, который выглядит немного громоздким, и я не уверен в его эффективности во время преобразования.

Это пример теста XML, который я создал:

<root>
  <sub_root>abc</sub_root>
  <sub_root>
    <child>test value</child>
    <child2>test value</child2>
    <sub_child>
      <node1>data</node1>
      <node2>data2</node2>
      <node3>
        <grand_child>test value</grand_child>
      </node3>
      <node4>test value</node4>
    </sub_child>
  </sub_root>
</root>

Это XSLT:

  <xsl:template match="@*|*|text()">
        <xsl:copy>
          <xsl:choose>
            <xsl:when test="text()='test value'">
              <xsl:apply-templates select="@*|*"/>
              <xsl:text>replaced</xsl:text>
            </xsl:when>
            <xsl:otherwise>
              <xsl:apply-templates select="@*|*|text()"/>
            </xsl:otherwise>
          </xsl:choose>
        </xsl:copy>
  </xsl:template>

Это желаемый вывод, я пытаюсь сгенерировать:

<root>
  <sub_root>abc</sub_root>
  <sub_root>
    <child>replaced</child>
    <child2>replaced</child2>
    <sub_child>
      <node1>data</node1>
      <node2>data2</node2>
      <node3>
        <grand_child>replaced</grand_child>
      </node3>
      <node4>replaced</node4>
    </sub_child>
  </sub_root>
</root>

может ли этот код быть написан еще лучше (в любых терминах)? Или это мой код достаточно лучше?

1 Ответ

5 голосов
/ 27 января 2010

Просто добавьте это к преобразованию идентичности:

<xsl:template match="text()[. = 'test value']">
    <xsl:text>replaced</xsl:text>
</xsl:template>

Результат будет копировать каждый узел на входе, без изменений, на выход - за исключением текстовых узлов, значение которых равно test value, которые будут преобразованы в текстовые узлы со значением replaced.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...