我有几百个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>
答案 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>