代码之家  ›  专栏  ›  技术社区  ›  sanjay

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

  •  0
  • sanjay  · 技术社区  · 6 年前

    我有这样的xml元素,

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

    <p> 要素如下:,

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

    , 不会出现在文本中间。(例如:“板球运动,霍基”)。但如果 , 在文本中有没有像这个例子中那样,这将被打断。

    标记化(,'',')

    有人能给我一个解决办法吗?

    0 回复  |  直到 6 年前
        1
  •  1
  •   Valdi_Bo    6 年前

    脚本失败的原因之一是 &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> 包含两个 关键字:值 对, 这是两个第一输出的来源 <p>