web-dev-qa-db-ja.com

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()関数を使用したいと思いますが、何でも機能します。

11
smaccoun

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>
20
Gunther

これはそれを行う必要があります:

_<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>
_

これもXSLT1.0と互換性があります。

サンプル入力で実行すると、結果は次のようになります。

_<node id="DSN">
  <event id="2190">
    <attribute key="Teardown" />
    <attribute key="Resource" />
  </event>
</node>
_

ここで注意すべきことの1つは、normalize-space()が属性値内の空白を単一のスペースに変換することです。したがって、次のようになります。

_<element attr="   this    is an
                   attribute   " />
_

これに変更されます:

_<element attr="this is an attribute" />
_

空白をそのままの値の範囲内に保つ必要がある場合は、Guntherの回答を参照してください。

8
JLRishe