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 2.0 中确实很容易,而在 XSLT 1.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 回答