Вы нашли ответ на свой главный вопрос - атрибут exclude-result-prefixes
xsl:stylesheet
должен использоваться для указания всех префиксов пространства имен (список, разделенный пробелами), на которые мы не хотели бы копироваться элементы буквального результата.
На ваш другой вопрос также легко ответить:
Кто-нибудь сравнивает без регистра?
Используйте
translate($s1, $vUpper, $vLower)
=
translate($s2, $vUpper, $vLower)
Это дает true()
точно, когда две строки $s1
и $s2
равны без учета регистра.
Переменная $vUpper
должна содержать все заглавные буквы алфавита, а переменная $vLower
должна содержать все строчные буквы алфавита.
Вот полный пример :
<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:param name="pNameOfElementsToDelete" select="'DeLetE'"/>
<xsl:variable name="vUpper" select=
"'ABCDEFGHIJKLMNOPQRSTUVWXYZ'"/>
<xsl:variable name="vLower" select=
"'abcdefghijklmnopqrstuvwxyz'"/>
<xsl:template match="node()|@*" name="identity">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="*[true()]">
<xsl:if test=
"not(
translate(name(), $vUpper, $vLower)
=
translate($pNameOfElementsToDelete, $vUpper, $vLower)
)
">
<xsl:call-template name="identity"/>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
при применении к этому документу XML :
<a>
<b>
<Delete/>
</b>
<dell/>
<c>
<deLete/>
</c>
</a>
это преобразование создает новый XML-документ, в котором любой элемент, имя которого равно без учета регистра "DeLetE"
:
<a>
<b/>
<dell/>
<c/>
</a>