2012-04-17 22 views
1

從以下xml中,我讀取了版本屬性。如何使用xslt解析屬性的值?

<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似乎選擇了這些值並刪除了任何空格。

+0

http://stackoverflow.com/questions/584082/xslt-best-way-to-split-and-render-comma-separated-text-as-html可能會指出你在正確的方向。 – 2012-04-17 18:46:08

+0

XSLT 1.0或2.0? – 2012-04-17 19:17:18

回答

0

DevNull問這裏的關鍵問題 - 有些東西是真正容易在XSLT 2.0,同時要求在XSLT 1.0了不少功夫 - 見下面的XSLT 2.0中的解決方案,在本質上利用了tokenize() funcion的:

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

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()