我有一个像这样的xml元素,
var url = string.Format("{0}/{1}/{2}",newLang, controller, action);
我需要将这些元素分解为多个<p>'data1':'2','data2':'Sports like Cricker, Hokey',</p>
元素,如下所示
<p>
我已经按照XSLT编写了该任务,
<p>'data1':'2'</p>
<p>'data2':'Sports like Cricket, Hokey',</p>
当<xsl:template match="p">
<xsl:variable name="tokens" select="tokenize(., ',')"/>
<xsl:for-each select="$tokens">
<xsl:analyze-string select="." regex="^'(.*)':'(.*)$">
<xsl:matching-substring>
<p>
<xsl:value-of select="."/>
</p>
</xsl:matching-substring>
</xsl:analyze-string>
</xsl:for-each>
</xsl:template>
未出现在文本中间时,此代码可以正常工作。 (例如:“板球,曲棍球之类的运动”)。但是,如果文本中有,
,则此示例将中断该操作。
我尝试如下使用tokenize函数,但似乎XSLT的tokenize()函数中不允许使用撇号。
tokenize(。,'',')
有人可以建议我解决这个问题吗?
答案 0 :(得分:1)
脚本失败的原因之一是您使用了'
而不是普通的撇号('
在写输出时使用,
但在正则表达式中仅使用'
)。
在第二个来源<p>
元素中可见的另一个原因是
终止'
,您有一个逗号,而您的正则表达式以$
终止。
因此正则表达式可以是:
'([^']+)'\s*:\s*'([^']+)'
详细信息:
下面有一个示例脚本:
<?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" indent="yes" />
<xsl:strip-space elements="*"/>
<xsl:template match="p">
<xsl:analyze-string select="." regex="'([^']+)'\s*:\s*'([^']+)'">
<xsl:matching-substring>
<p><xsl:value-of select="concat(regex-group(1),
' / ', regex-group(2))"/></p>
</xsl:matching-substring>
</xsl:analyze-string>
</xsl:template>
<xsl:template match="@*|node()">
<xsl:copy><xsl:apply-templates select="@*|node()"/></xsl:copy>
</xsl:template>
</xsl:stylesheet>
对于以下源数据:
<?xml version="1.0" encoding="utf-8" ?>
<body>
<p>'data1':'2','data3':'5'</p>
<p>'data2':'Sports like Cricket, Hokey',</p>
</body>
它输出:
<?xml version="1.0" encoding="UTF-8"?>
<body>
<p>data1 / 2</p>
<p>data3 / 5</p>
<p>data2 / Sports like Cricket, Hokey</p>
</body>
请注意,第一个来源<p>
包含两个 key:value 对,
这是两个第一个输出<p>
元素的来源。