2010-08-16 66 views
2

如何將XSLT應用於以下XML,以便〜和$之間的字符串在輸出中變爲紅色。在XML上應用XSLT以獲取格式化(顏色)輸出

當您只有一個包含〜和$的字符串時,以下XSLT工作。當你有多個包含〜和$的字符串時它將不起作用。 信息 我使用了相同的模板DATAC'

我用Java比較字符串。

我可以選擇更改java或XSLT中的代碼。

感謝

XML

<?xml version="1.0" encoding="UTF-8"?> 
<?xml-stylesheet type='text/xsl' href='StyleSheet.xsl'?> 
<log > 
     <rows> 
     <ID>1</ID> 
     <DataP> 
    BookID = UJ2445320A 
    Qty = 1 ISBN = 45320A 
    ~publishDate = 1/1/2006 $ 
    ~Name =Learn XML $ 
    </DataP> 
    <DataC> 
    BookID = UJ2445320A 
    Qty = 1 ISBN = 45320A 
    ~publishDate =2/2/2010$ 
    ~Name =Learn XML 1.0 $ 
    </DataC> 
      </rows> 
    </log> 

XSLT

<xsl:for-each select="rows"> 
    <tr> 
    <td><xsl:value-of select="ID"/></td> 
    <xsl:apply-templates select="DataP"/> 
    <xsl:apply-templates select="DataC"/> 
    </tr> 
    </xsl:for-each> 
</xsl:for-each> 
</xsl:template> 
    <xsl:template match="DataP"> 
    <xsl:choose> 
    <xsl:when test="contains(.,'~')"> 
    <td> 
    <xsl:value-of select="substring-before(.,'~')"/> 
    <span style="color:red;"><xsl:value-of select="substring-before(substring-after(.,'~'),'$')"/></span> 
    <xsl:value-of select="substring-after(.,'$')"/> 
    </td> 
    </xsl:when> 
    <xsl:otherwise> 
    <td><xsl:value-of select="."/></td> 
    </xsl:otherwise> 
    </xsl:choose> 
</xsl:template> 

Java代碼

StringBuilder sbcp = new StringBuilder(); 
StringBuilder sbpp = new StringBuilder(); 
String[] spilt = StringUtils.split(DataC, "|"); 
String[] spilt2 = StringUtils.split(DataP, "|"); 

for (int i = 0; i < spilt.length; i++) 
     { 
      if(spilt2[i].toString().equals(spilt[i])) 
      { 
       sbcp.append(spilt[i]); 
       sbpp.append(spilt2[i]); 
      } 
      else 
      { 
       sbcp.append("~").append(spilt[i]).append("$"); 
       sbpp.append("~").append(spilt2[i]).append("$"); 
      } 
     } 
+0

好問題(+1)。查看我的答案以獲取完整的XSLT 1.0解決方案。 :) – 2010-08-16 02:21:23

回答

2

下面是一個完整XSLT 1.0溶液

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:template match="/*"> 
    <table border="1"> 
    <xsl:apply-templates/> 
    </table> 
</xsl:template> 

<xsl:template match="rows"> 
    <tr> 
    <xsl:apply-templates/> 
    </tr> 
</xsl:template> 

<xsl:template match="ID"> 
    <td><xsl:value-of select="."/></td> 
</xsl:template> 

<xsl:template match="DataP|DataC"> 
    <td> 
    <xsl:call-template name="formatText"> 
    <xsl:with-param name="pText" select="."/> 
    </xsl:call-template> 
    </td> 
</xsl:template> 

<xsl:template name="formatText"> 
    <xsl:param name="pText"/> 
    <xsl:param name="pStartDelim" select="'~'"/> 
    <xsl:param name="pEndDelim" select="'$'"/> 

    <xsl:if test="string-length($pText)"> 
     <xsl:variable name="vText" select= 
      "concat($pText, $pStartDelim)"/> 
     <xsl:variable name="vBeforePat" select= 
      "substring-before($vText, $pStartDelim)"/> 
     <xsl:variable name="vInText" select= 
     "substring-before(substring-after($vText, $pStartDelim), 
         $pEndDelim 
         ) 
     "/> 

     <xsl:variable name="vExistsInText" 
      select="string-length($vInText)"/> 

    <xsl:value-of select="$vBeforePat"/> 

    <xsl:if test="$vExistsInText"> 
     <span style="color:red;"> 
     <xsl:value-of select="$vInText"/> 
     </span> 

     <xsl:call-template name="formatText"> 
     <xsl:with-param name="pText" select= 
     "substring($pText, 
        1 
        + string-length($vBeforePat)+1 
        + $vExistsInText 
        + boolean($vExistsInText) 
        ) 
     "/> 
     </xsl:call-template> 
    </xsl:if> 
    </xsl:if> 
</xsl:template> 
</xsl:stylesheet> 

當這種轉變是在這個XML文件施加:

<log> 
    <rows> 
     <ID>1</ID> 
     <DataP> 
    BookID = UJ2445320A 
    Qty = 1 ISBN = 45320A 
    ~publishDate = 1/1/2006 $; 
    ~Name =Learn XML $ 
     </DataP> 
     <DataC> 
    BookID = UJ2445320A 
    Qty = 1 ISBN = 45320A 
    ~publishDate =2/2/2010$; 
    ~Name =Learn XML 1.0 $ 
     </DataC> 
    </rows> 
</log> 

有用的,正確的輸出產生

<table border="1"> 
    <tr> 
     <td>1</td> 
     <td> 
    BookID = UJ2445320A 
    Qty = 1 ISBN = 45320A 
    <span style="color:red;">publishDate = 1/1/2006 </span>; 
    <span style="color:red;">Name =Learn XML </span> 

     </td> 
     <td> 
    BookID = UJ2445320A 
    Qty = 1 ISBN = 45320A 
    <span style="color:red;">publishDate =2/2/2010</span>; 
    <span style="color:red;">Name =Learn XML 1.0 </span> 

     </td> 
    </tr> 
</table> 

請注意如何通過遞歸命名模板實現文本的格式化。

0

我認爲正則表達式可能是一種方法。您只需構建'~ someString $'圖案並將它們變成紅色。

0

你可以嘗試xsl analyze string

<xsl:template match="DataP"> 
    <xsl:analyze-string select="." regex="~(.*?)\$"> 
    <xsl:matching-substring> 
     <span style="color:red;"><xsl:value-of select="regex-group(1)"/></span> 
    </xsl:matching-substring> 
    <xsl:non-matching-substring> 
     <xsl:value-of select="."/> 
    </xsl:non-matching-substring> 
    </xsl:analyze-string> 
</xsl:template> 

不知道,如果正則表達式是正確的,你應該雙檢吧。

+1

也許〜([^ $] *)\ $會更好? – 2010-08-16 08:02:57