Xml xslt中的模式匹配
我有以下xmlXml xslt中的模式匹配,xml,xslt,xpath,Xml,Xslt,Xpath,我有以下xml <xml> <para> <number>1</number> <text> Paragraph 1(<italic>A</italic>) is this para.</text> </para> </xml> 1. 第1款(A)项是本款。 如果我发现一个模式以单词段落开始,后跟空格,后跟一个或多个数字,后跟“
<xml>
<para>
<number>1</number>
<text> Paragraph 1(<italic>A</italic>) is this para.</text>
</para>
</xml>
1.
第1款(A)项是本款。
如果我发现一个模式以单词段落开始,后跟空格,后跟一个或多个数字,后跟“(“后跟节点斜体和数字并结束”)”,我希望匹配文本元素。然后它应该在它周围放一个锚标签。所以上述xml的输出应该是
<xml>
<para>
<number>1</number>
<text> <a href="Paragraph1(A)">Paragraph 1(<italic>A</italic>)</a> is this para.</text>
</para>
</xml>
1.
这是段落。
i、 e用标记替换第1(A)
段,href值应为匹配文本,无空格和斜体节点
如何在正则表达式中处理的任何帮助或提示…此正则表达式不带引号:
".*(Paragraph ([0-9]+)`\`(<italic>([0-9])</italic>`\`)"
“*(段落([0-9]+)`([0-9])`
将为您提供一个外部级别捕获组和两个嵌入式捕获组,用于提供值。外部级别捕获组为#1,两个嵌入式捕获组为#2和#3。
请注意,文字值“(”用“
\
”转义,因为“(”是正则表达式中的保留字符。这可以让您了解如何解决它:
<?xml version="1.0"?>
不匹配
它基本上使用XSLT标识模板来复制原始文档,并定义一个模板来处理
元素。在这里,它分析它的Text()内容和相应的Regex:段落。如果它发现它生成了锚定子结构。为此,我使用了一些临时变量
这里是我的输出文件:
<xml>
<para>
<number>1</number>
<text><a href="Paragraph1(A)"> Paragraph 1(A) is this para.</a></text>
</para>
</xml>
1.
我仍然缺少第1段(A
),而不是我得到的:第1段(A),但这只是一些调整
看看它可能会帮助您理解XSLT中的正则表达式
请注意,它使用XSLT 2.0此XSLT 2.0样式表生成所需的结果:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:output omit-xml-declaration="no" indent="yes"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<!-- Only our text element requires special handling here....-->
<xsl:template match="text[matches(.,'Paragraph\s+\d*')]">
<xsl:copy>
<xsl:variable name="textElement" select="."/>
<xsl:analyze-string select="." regex="(Paragraph\s+\d*)(\(.*\))">
<xsl:matching-substring>
<a href="{concat(replace(regex-group(1),'\s',''),regex-group(2))}">
<xsl:apply-templates select="$textElement/node()"/>
</a>
</xsl:matching-substring>
</xsl:analyze-string>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
为什么需要正则表达式?下面的代码有什么问题
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="/xml/para/text">
<xsl:copy>
<a href="Paragraph1(A)">
<xsl:apply-templates select="@*|node()"/>
</a>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
Thx Adolfo对于一项工作来说,输出中的缺失是一个问题…不知道如何在输出中获得它…我明天会尝试一下,但我想我们会越来越近。我给出了基于许多假设的解决方案,但我至少会尝试解决您的简单示例好主意,将谓词放入模板匹配中。我只会剥离空间
Hi Mads,我得到的输出是整个文本()转换成的是这个段落。这个代码硬编码为“1”,而问题要求“后跟一个或多个数字”。
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="/xml/para/text">
<xsl:copy>
<a href="Paragraph1(A)">
<xsl:apply-templates select="@*|node()"/>
</a>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>