2010-08-16 67 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