XSLT: узел изменения внутренний текст

Я должен преобразовать следующий xml документ:

<a>
  <b/>
  <c/>
   myText
</a>

в это:

<a>
  <b/>
  <c/>
   differentText
</a>

Так, я записал этот документ XSLT

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:output method="xml" version="1.0" omit-xml-declaration="no" />

  <xsl:template match="/a/text()">
    <a>
      <b/>
      <c/>
      differentText
    </a>
</xsl:template>
</xsl:stylesheet>

Таким образом, я получаю следующий результат:

<?xml version="1.0" encoding="utf-8"?>
<a>
  <b /><c />
  differentText
</a>
<a>
  <b /><c />
  differentText
</a>
<a>
  <b /><c />
  differentText
</a>

Результат кажется повторным 3 раза, потому что делаются 3 соответствия.. Почему? Я мог я фиксировать его?Спасибо

8
задан Nabo 22 May 2010 в 16:37
поделиться

2 ответа

Исключите текстовые узлы, содержащие только пробелы. Знайте и используйте инструкцию.

Это преобразование:

<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output omit-xml-declaration="yes" indent="yes"/>
    <xsl:strip-space elements="*"/>

 <xsl:template match="node()|@*">
     <xsl:copy>
       <xsl:apply-templates select="node()|@*"/>
     </xsl:copy>
 </xsl:template>

 <xsl:template match="a/text()">
   <xsl:text>Diferent text</xsl:text>
 </xsl:template>
</xsl:stylesheet>

при применении к предоставленному XML-документу дает желаемый правильный результат.

Нет необходимости в сложных предикатах в выражении соответствия конкретного шаблона!

Мы должны стремиться к самому простому, короткому, элегантному, читаемому, понятному решению, которое использует всю мощь языка.

Есть шанс, что такое решение будет наиболее понятным, наиболее простым в реализации и, скорее всего, будет оптимизировано любым процессором XSLT, что приведет к наиболее эффективной реализации.

8
ответ дан 5 December 2019 в 12:08
поделиться

Здесь три совпадения, выделенных квадратными скобками:

<a>[
  ]<b/>[
  ]<c/>[
   myText
]</a>

Вы хотите что-то вроде:

<xsl:template match="/a/text()[normalize-space() != '']">
6
ответ дан 5 December 2019 в 12:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: