XSLT-'撇号'不能在tokenize()函数中使用

时间:2019-04-02 12:28:01

标签: xml xslt xslt-2.0

我有一个像这样的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="^&apos;(.*)&apos;:&apos;(.*)$"> <xsl:matching-substring> <p> <xsl:value-of select="."/> </p> </xsl:matching-substring> </xsl:analyze-string> </xsl:for-each> </xsl:template> 未出现在文本中间时,此代码可以正常工作。 (例如:“板球,曲棍球之类的运动”)。但是,如果文本中有,,则此示例将中断该操作。

我尝试如下使用tokenize函数,但似乎XSLT的tokenize()函数中不允许使用撇号。

tokenize(。,'',')

有人可以建议我解决这个问题吗?

1 个答案:

答案 0 :(得分:1)

脚本失败的原因之一是您使用了&apos; 而不是普通的撇号(&apos;在写输出时使用, 但在正则表达式中仅使用')。

在第二个来源<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>元素的来源。