Я должен преобразовать следующий 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 соответствия.. Почему? Я мог я фиксировать его?Спасибо
Исключите текстовые узлы, содержащие только пробелы. Знайте и используйте
инструкцию.
Это преобразование:
<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, что приведет к наиболее эффективной реализации.
Здесь три совпадения, выделенных квадратными скобками:
<a>[
]<b/>[
]<c/>[
myText
]</a>
Вы хотите что-то вроде:
<xsl:template match="/a/text()[normalize-space() != '']">