各属性の先頭と末尾の空白を削除して、同じ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()
関数を使用したいと思いますが、何でも機能します。
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>
_
これも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の回答を参照してください。