如何使用xslt解析属性的值?

时间:2012-04-17 18:40:00

标签: xml xslt

从下面的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似乎选择值并删除任何空格。

2 个答案:

答案 0 :(得分: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循环。

答案 1 :(得分: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()