Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml xslt中的模式匹配_Xml_Xslt_Xpath - Fatal编程技术网

Xml xslt中的模式匹配

Xml 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

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