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