XSLT удаляет начальные и конечные пробелы всех атрибутов
как я могу создать идентичный XML-лист, но с удаленными начальными и конечными пробелами каждого атрибута? (с помощью XSLT 2.0)
уйти от этого:
<node id="DSN ">
<event id=" 2190 ">
<attribute key=" Teardown"/>
<attribute key="Resource "/>
</event>
</node>
для этого:
<node id="DSN">
<event id="2190">
<attribute key="Teardown"/>
<attribute key="Resource"/>
</event>
</node>
полагаю, я предпочел бы использовать normalize-space()
функция, но все работает.
2 ответов
normalize-space()
не только удалит начальные и конечные пробелы, но и установит один пробел вместо любой последовательности последовательных пробелов.
регулярное выражение может использоваться для обработки только ведущих и конечных пробелов:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:template match="node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="@*">
<xsl:attribute name="{local-name()}" namespace="{namespace-uri()}">
<xsl:value-of select="replace(., '^\s+|\s+$', '')"/>
</xsl:attribute>
</xsl:template>
</xsl:stylesheet>
Это должно сделать это:
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/>
<xsl:template match="node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="@*">
<xsl:attribute name="{name()}">
<xsl:value-of select="normalize-space()"/>
</xsl:attribute>
</xsl:template>
</xsl:stylesheet>
Это также совместимо с XSLT 1.0.
при запуске на входе образца, результат:
<node id="DSN">
<event id="2190">
<attribute key="Teardown" />
<attribute key="Resource" />
</event>
</node>
одна вещь, чтобы отметить здесь, что normalize-space()
превратит любые пробелы в значениях атрибутов в одиночные пробелы, так что это:
<element attr=" this is an
attribute " />
будет изменено на это:
<element attr="this is an attribute" />
Если вам нужно сохранить пробелы в пределах значения как есть, то см. ответ Гюнтера.