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" />

Если вам нужно сохранить пробелы в пределах значения как есть, то см. ответ Гюнтера.