【问题标题】:XSLT - 'apostrophe' cannot use in tokenize() functionXSLT - '撇号' 不能在 tokenize() 函数中使用
【发布时间】:2019-04-02 12:28:00
【问题描述】:

我有一个这样的xml元素,

<p>'data1':'2','data2':'Sports like Cricker, Hokey',</p>

我需要将这些元素分解成多个&lt;p&gt;元素如下,

<p>'data1':'2'</p>
<p>'data2':'Sports like Cricket, Hokey',</p>

我已经编写了以下 XSLT 来完成这项任务,

<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>

, 没有出现在文本中间时,此代码可以正常工作。 (例如:“像板球、Hokey 这样的运动”)。但是如果, 出现在文本中,这将像本例一样中断。

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

tokenize(., '',')

谁能建议我解决这个问题?

【问题讨论】:

  • 你可以使用xsl:analyze-string 来打破这种模式吗?至于在由单引号分隔的 XSLT/XPath 字符串文字中使用单引号 ',您需要将其加倍,例如''','.

标签: xml xslt xslt-2.0


【解决方案1】:

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

在第二个来源&lt;p&gt; 元素中可见的另一个原因是,在 终止' 你有一个逗号,而你的正则表达式以$ 终止。

所以正则表达式可以是例如:

'([^']+)'\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>

请注意,第一个源 &lt;p&gt; 包含两个 key : value 对, 这是两个第一个输出 &lt;p&gt; 元素的来源。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多