我需要找到重复的节点(由ID标识),如果存在这样的节点,那么我需要更新其中一个节点的id。如果有人可以让我知道如何根据xpath或xsl进行操作,我们将不胜感激。
示例xml:
<music>
<title id="1"/>
<title id="2"/>
<title id="1"/>
</music>
第一个和第三个节点具有相同的ID。所以,第三个的id改为'3'。我需要将其更改为以下内容:
<music>
<title id="1"/>
<title id="2"/>
<title id="3"/>
</music>
答案 0 :(得分:0)
请尝试以下模板:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:template match="music">
<xsl:copy>
<xsl:for-each select="*">
<xsl:element name="{name()}">
<xsl:attribute name="id">
<xsl:choose>
<xsl:when test="preceding::*/@id=current()/@id">
<xsl:value-of select="generate-id()"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="@id"/>
</xsl:otherwise>
</xsl:choose>
</xsl:attribute>
<xsl:apply-templates/>
</xsl:element>
</xsl:for-each>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
答案 1 :(得分:0)
通常,ID的目的是唯一地标识元素。如果是这样,那么实际的ID字符串是无关紧要的 - 只要没有重复项。
因此,解决问题的最简单方法是对所有title
元素进行一致编号,正如@ michael.hor257k所述。这可以使用position()
或xsl:number
完成。
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/music">
<xsl:copy>
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>
<xsl:template match="title">
<xsl:copy>
<xsl:attribute name="id">
<xsl:number/>
</xsl:attribute>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
<强>输出强>
<?xml version="1.0" encoding="UTF-8"?>
<music>
<title id="1"/>
<title id="2"/>
<title id="3"/>
</music>