XSLT: изменить внутренний текст узла - PullRequest
8 голосов
/ 22 мая 2010

Мне нужно преобразовать следующий 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 матча выполняются .. Почему? Я мог бы это исправить? Спасибо

Ответы [ 2 ]

8 голосов
/ 22 мая 2010

Исключить текстовые узлы только для пробелов. Знать и использовать инструкцию <xsl:strip-space> .

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

<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, что приведет к наиболее эффективной реализации.

6 голосов
/ 22 мая 2010

Там - это три совпадения, выделенные квадратными скобками:

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

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

<xsl:template match="/a/text()[normalize-space() != '']">
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...