如何在跟随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 CODE
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 :(得分: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>
请注意如何通过递归命名模板实现文本格式化。
答案 1 :(得分:0)
我认为正则表达式可能是一种方法。您只需构建'~ someString $'
图案并将其转换为红色。
答案 2 :(得分: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>
不确定正则表达式是否正确,您应该重新检查它。