如何处理<&引用;及&燃气轮机&引用;xslt中的正则表达式
我有XML中的字符串,如何处理<&引用;及&燃气轮机&引用;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
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="<italic>([^<]+)</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="<italic>([^<]+)</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,然后应用正则表达式。它工作得很好。