1

次の xml から、Version 属性を読み取ります。

<BatchTable>
  <UUThref
    SocketIndex='0 - CCM'
    UUTResult='Passed'
    URL='C:\OverrideCallbacks_BatchReport[4 16 2012][5 44 41 PM].xml'
    FileName='OverrideCallbacks_BatchReport[4 16 2012][5 44 41 PM].xml'
    ECAFailCount='1'
    Version='StationPartNumber=55555 StationSerialNumber=2222 TPSPartNumber=1234'/>
</BatchTable>

Version 属性の値は動的であり、ユーザーは任意の長さの文字列を追加できます。値を分割して別々の行に表示するにはどうすればよいですか。このように表示されるように

StationPartNumber=55555
StationSerialNumber=2222
TPSPartNumber=1234

現在、バージョン値を読み取ると、次のように表示されます。

StationPartNumber=55555 StationSerialNumber=2222 TPSPartNumber=1234

値の間に特殊文字を追加する必要がある場合は、ユーザーに追加してもらい、分割を容易にすることができます。現在、連結の間に「\n」が追加されていますが、xsl は値を選択して空白を削除しているようです。

4

2 に答える 2

0

これは、XSLT 1.0 で行うのは非常に簡単です (単一の XPath 式でも作成できます)

使用するだけです:

translate(normalize-space(/*/*/@Version), ' ', '&#xA;')

完全な変換は次のとおりです。投稿された XSLT 2.0 ソリューションよりも単純で短いものです。いいえxsl:variable、いいえxsl:for-each:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="text"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="UUThref">
  <xsl:value-of select=
   "translate(normalize-space(/*/*/@Version), ' ', '&#xA;')"/>
 </xsl:template>
</xsl:stylesheet>

この変換が提供された XML ドキュメントに適用される場合:

<BatchTable>
    <UUThref
      SocketIndex='0 - CCM'
            UUTResult='Passed'
          URL='C:\OverrideCallbacks_BatchReport[4 16 2012][5 44 41 PM].xml'
            FileName='OverrideCallbacks_BatchReport[4 16 2012][5 44 41 PM].xml'
            ECAFailCount='1'
            Version='StationPartNumber=55555 StationSerialNumber=2222 TPSPartNumber=1234'/>
</BatchTable>

必要な正しい結果が生成されます。

StationPartNumber=55555
StationSerialNumber=2222
TPSPartNumber=1234

説明:

XPath 関数の適切な使用normalize-space()translate()

于 2012-04-18T01:59:18.123 に答える
0

DevNull はここで重要な質問をしました。XSLT 1.0 では多くの労力が必要ですが、XSLT 2.0 では非常に簡単なことがいくつかあります。XSLT 2.0 での解決策については、以下を参照してtokenize()ください。

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
    <xsl:template match="UUThref">
        <root>
            <xsl:variable name="test" select="tokenize(@Version, '\s+')"/>
            <xsl:for-each select="$test">
                <w><xsl:value-of select="."/></w>
            </xsl:for-each>
        </root>
    </xsl:template>
</xsl:stylesheet>

与える

<?xml version="1.0" encoding="UTF-8"?>
<root>
    <w>StationPartNumber=55555</w>
    <w>StationSerialNumber=2222</w>
    <w>TPSPartNumber=1234</w>
</root>

説明:\s+ゼロ以外の数の連続する空白 (スペース、CR、LF、またはタブ) を表します。
このtokenize()関数は、指定された正規表現区切り文字に基づいてテキスト値を分割した結果の文字列で構成されるノード セットを作成します。
このノード セットは、 によってループできますxsl:for-each

于 2012-04-17T22:03:21.553 に答える