如何处理<&引用;及&燃气轮机&引用;xslt中的正则表达式

如何处理<&引用;及&燃气轮机&引用;xslt中的正则表达式,xslt,xslt-2.0,Xslt,Xslt 2.0,我有XML中的字符串,a,我正在使用xsl:analyze-string以这种模式提取所有斜体字:“a”。我知道我可以在斜体上使用模板匹配,但这里的要求是使用正则表达式匹配它。我试图这样编写表达式,()[a-z]+,但是XSLT处理器在开头上抛出了一个错误,只要a是一个实际的字符串,您就可以使用作为)不需要转义 例如: 示例XML输入 <test><![CDATA[<italic>a</italic>]]></test> a]> X

我有XML中的字符串,
a
,我正在使用
xsl:analyze-string
以这种模式提取所有斜体字:
“a”
。我知道我可以在斜体上使用模板匹配,但这里的要求是使用正则表达式匹配它。我试图这样编写表达式,
()[a-z]+
,但是XSLT处理器在开头
上抛出了一个错误,只要
a
是一个实际的字符串,您就可以使用
作为<字符。大于(>)不需要转义

例如:

示例XML输入

<test><![CDATA[<italic>a</italic>]]></test>
a]>
XSLT2.0

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output indent="yes"/>
  <xsl:strip-space elements="*"/>

  <xsl:template match="node()|@*">
    <xsl:copy>
      <xsl:apply-templates select="node()|@*"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="/">
    <xsl:analyze-string select="test" regex="&lt;italic>([^&lt;]+)&lt;/italic>">
      <xsl:matching-substring>
        <results>
          <xsl:value-of select="regex-group(1)"/>
        </results>
      </xsl:matching-substring>
    </xsl:analyze-string>
  </xsl:template>

</xsl:stylesheet>

XML输出:

<results>a</results>
a
只要
a
是一个实际的字符串,您就可以对
字符使用
。大于(>)不需要转义

例如:

示例XML输入

<test><![CDATA[<italic>a</italic>]]></test>
a]>
XSLT2.0

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output indent="yes"/>
  <xsl:strip-space elements="*"/>

  <xsl:template match="node()|@*">
    <xsl:copy>
      <xsl:apply-templates select="node()|@*"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="/">
    <xsl:analyze-string select="test" regex="&lt;italic>([^&lt;]+)&lt;/italic>">
      <xsl:matching-substring>
        <results>
          <xsl:value-of select="regex-group(1)"/>
        </results>
      </xsl:matching-substring>
    </xsl:analyze-string>
  </xsl:template>

</xsl:stylesheet>

XML输出:

<results>a</results>
a

您没有说明XML源代码是什么样子的,但是如果
a
是一个普通的XML元素,那么您就无法使用正则表达式匹配元素的词法形式。这是因为XSLT的输入是一个节点树,而不是一个词汇XML标记字符串。这一概念对于理解XSLT的工作原理至关重要

您没有说明XML源代码是什么样子的,但是如果
a
是一个普通的XML元素,那么您就无法使用正则表达式匹配元素的词法形式。这是因为XSLT的输入是一个节点树,而不是一个词汇XML标记字符串。这一概念对于理解XSLT的工作原理至关重要

a
是一个普通的xml元素,如果您使用的是saxon xslt处理器,则使用扩展函数net.sf.saxon.serialize对xml进行序列化,然后应用正则表达式。它工作得很好。

是一个普通的xml元素,如果您使用的是saxon xslt处理器,则使用扩展函数net.sf.saxon.serialize来序列化xml,然后应用正则表达式。它工作得很好。

是CDATA中的
还是以其他方式转义的(
/
)?您确定处理器将其视为字符串吗?我尝试将其转换为(\)(斜体)(\)[a-z+](\)(斜体)(\/)(\)但结果相同。。。xslt抛出错误…是CDATA中的
a
,还是以其他方式转义(
/
)?您确定处理器将其视为字符串吗?我尝试将其转换为(\)(斜体)(\)[a-z+](\)(斜体)(\/)(\)但结果相同。。。xslt抛出错误…如果您将模式本身放在CDATA中(例如,
([^
),然后将其与
一起使用,那么代码可能更适合阅读。我同意DevNull,但是正则表达式中有一个小错误。正确的正则表达式是:regex=“italic>([^]+)/italic>“额外的加号是因为捕获到的标记(如果我理解正确)可以是多个字符。问题指定“斜体字”这意味着多个字符幸运的是,它不是一个字符串,而是一个实际的元素。我在saxon xslt处理器中找到了一种方法,使用net.sf.saxon.serialize函数序列化xml,然后应用正则表达式。如果您将模式本身放在CDATA中,例如
([^
,然后将其与
一起使用。我同意DevNull,但您的正则表达式中有一个小错误。正确的正则表达式是什么:regex=“italic>([^]+)/italic>“额外的加号是因为捕获的标记(如果我理解正确)可以是多个字符。问题指定了“斜体字”这意味着多个字符幸运的是,它不是一个字符串,而是一个实际的元素。我在saxon xslt处理器中找到了一种方法,使用net.sf.saxon.serialize函数序列化xml,然后应用正则表达式。a是一个普通的xml元素,不是字符串,我在saxon xslt处理器中找到了一种方法,使用net.sf.saxon.serialize函数序列化xml,然后应用正则表达式。它工作得很好。a是一个普通的xml元素,不是字符串,我在saxon xslt处理器中找到了一种方法,使用net.sf.saxon.serialize函数序列化xml,然后应用正则表达式。它工作得很好。