正则表达式如何替换所有实例除外

时间:2017-03-20 11:04:26

标签: regex xslt

我有几百个XML文件,我需要稍作修改。我知道我真的应该使用XSLT对XML结构进行批量更改,但我认为一些快速而肮脏的Regex将比我制定XSLT更快地完成所需的工作。至少我认为在花费数小时试图让Regex正确之前!!

采用以下示例,我所拥有的是各种列表<seqlist>,其中包含列表中每个项目的<items>个元素。每个<item>元素都包含一个<para>元素,该元素具有各种ID属性值。我想完全删除这些<para>代码,以便<item>包含实际文本。

所以来自:<seqlist><item><para id="1.1">Some text here.</para></item></seqlist> 收件人:<seqlist><item>Some text here.</item></seqlist>

这本身就相当直接,我可以这样做:

正则表达式:<item><para id="([^\"]*)"> 替换:<item>

然后通过执行简单的查找替换

来删除冗余的结束标记

查找:</para></item> 替换:</item>

但是,从下面的示例中可以看出,列表中的一些<item>元素包含嵌套在其中的另一个<seqlist>,其中包含进一步嵌套的<item>广告{{1} }标签。这意味着以上查找替换以删除结束<para>标记将导致下面示例中最后一行中的结束</para>也被替换。

基本上我需要说的是:找到</para>并替换为</para></item>除非左侧有一个开放的</item>元素。

以下示例的最后一行更好地解释了它。如果我做上述查找&amp;替换上一个<para>将被删除,它将无法解析。

任何想法如何实现这一点?

</para>

1 个答案:

答案 0 :(得分:0)

这是一个简单的XSLT方式:

<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">

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

    <xsl:template match="seqlist/item/para">
        <xsl:apply-templates/>
    </xsl:template>
</xsl:transform>

http://xsltransform.net/3NSSEw6在线。

如果只删除具有para属性的id个元素,请使用

<xsl:template match="seqlist/item/para[@id]">
    <xsl:apply-templates/>
</xsl:template>

代替该模板,http://xsltransform.net/3NSSEw6/1