我有一个XML文件,我在其中重复,它们有自己的ITEM_ID和NAME。正如您在示例中所看到的,我们有 6 个项目:
<ITEMS>
<ITEM>
<ITEM_ID>1234</ITEM_ID>
<ITEM_NAME>TEST_ITEM_1</ITEM_NAME>
</ITEM>
<ITEM>
<ITEM_ID>3216</ITEM_ID>
<ITEM_NAME>TEST_ITEM_2</ITEM_NAME>
</ITEM>
<ITEM>
<ITEM_ID>8956</ITEM_ID>
<ITEM_NAME>TEST_ITEM_3</ITEM_NAME>
</ITEM>
<ITEM>
<ITEM_ID>4562</ITEM_ID>
<ITEM_NAME>TEST_ITEM_4</ITEM_NAME>
</ITEM>
<ITEM>
<ITEM_ID>4562</ITEM_ID>
<ITEM_NAME>TEST_ITEM_5</ITEM_NAME>
</ITEM>
<ITEM>
<ITEM_ID>8569</ITEM_ID>
<ITEM_NAME>TEST_ITEM_6</ITEM_NAME>
</ITEM>
</ITEMS>
我希望结果是这样的:
<ARTICLES>
<ARTICLE CODE="1">
<ARTICLE_ID>1234</ARTICLE_ID>
<ARTICLE_NAME>TEST_ARTICLE_1</ARTICLE_NAME>
</ARTICLE>
<ARTICLE CODE="2">
<ARTICLE_ID>3216</ARTICLE_ID>
<ARTICLE_NAME>TEST_ARTICLE_2</ARTICLE_NAME>
</ARTICLE>
<ARTICLE CODE="3">
<ARTICLE_ID>8956</ARTICLE_ID>
<ARTICLE_NAME>TEST_ARTICLE_3</ARTICLE_NAME>
</ARTICLE>
<ARTICLE CODE="4">
<ARTICLE_ID>4562</ARTICLE_ID>
<ARTICLE_NAME>TEST_ARTICLE_4</ARTICLE_NAME>
</ARTICLE>
<ARTICLE CODE="4">
<ARTICLE_ID>4562</ARTICLE_ID>
<ARTICLE_NAME>TEST_ARTICLE_5</ARTICLE_NAME>
</ARTICLE>
<ARTICLE CODE="5">
<ARTICLE_ID>8569</ARTICLE_ID>
<ARTICLE_NAME>TEST_ARTICLE_6</ARTICLE_NAME>
</ARTICLE>
</ARTICLES>
在这里,属性 CODE 应该具有 ITEM 的位置,但其中ITEM_ID相同,例如第 4 和第 5 个,那么在这种情况下,在结果文件中,CODE 应该具有与您在结果文件中看到的值相同的值(CODE 属性)。下一个节点不应具有输入 xml 的实际位置,而应将增量编号设置为"5",因为您可以在结果 XML 中看到最后一个 ARTICLE。
提前谢谢。
你会得到编号
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output indent="yes"/>
<xsl:key name="by-id" match="ITEM" use="ITEM_ID"/>
<xsl:template match="ITEMS">
<ARTICLES>
<xsl:apply-templates select="ITEM[generate-id() = generate-id(key('by-id', ITEM_ID)[1])]"/>
</ARTICLES>
</xsl:template>
<xsl:template match="ITEM">
<xsl:variable name="pos" select="position()"/>
<xsl:apply-templates select="key('by-id', ITEM_ID)" mode="article">
<xsl:with-param name="code" select="$pos"/>
</xsl:apply-templates>
</xsl:template>
<xsl:template match="ITEM" mode="article">
<xsl:param name="code"/>
<ARTICLE CODE="{$code}">
<xsl:apply-templates/>
</ARTICLE>
</xsl:template>
<xsl:template match="ITEM_ID">
<ARTICLE_ID>
<xsl:apply-templates/>
</ARTICLE_ID>
</xsl:template>
<xsl:template match="ITEM_NAME">
<ARTICLE_NAME>
<xsl:apply-templates/>
</ARTICLE_NAME>
</xsl:template>
</xsl:stylesheet>
您似乎还想将每个名称中的"ITEM"一词替换为"ARTICLE",这可以通过模板中调用的模板来完成 ITEM_NAME
.下面是一个示例:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output indent="yes"/>
<xsl:key name="by-id" match="ITEM" use="ITEM_ID"/>
<xsl:template match="ITEMS">
<ARTICLES>
<xsl:apply-templates select="ITEM[generate-id() = generate-id(key('by-id', ITEM_ID)[1])]"/>
</ARTICLES>
</xsl:template>
<xsl:template match="ITEM">
<xsl:variable name="pos" select="position()"/>
<xsl:apply-templates select="key('by-id', ITEM_ID)" mode="article">
<xsl:with-param name="code" select="$pos"/>
</xsl:apply-templates>
</xsl:template>
<xsl:template match="ITEM" mode="article">
<xsl:param name="code"/>
<ARTICLE CODE="{$code}">
<xsl:apply-templates/>
</ARTICLE>
</xsl:template>
<xsl:template match="ITEM_ID">
<ARTICLE_ID>
<xsl:apply-templates/>
</ARTICLE_ID>
</xsl:template>
<xsl:template match="ITEM_NAME">
<ARTICLE_NAME>
<xsl:call-template name="replace">
<xsl:with-param name="input" select="."/>
<xsl:with-param name="to-be-replaced" select="'ITEM'"/>
<xsl:with-param name="replacement" select="'ARTICLE'"/>
</xsl:call-template>
</ARTICLE_NAME>
</xsl:template>
<xsl:template name="replace">
<xsl:param name="input"/>
<xsl:param name="to-be-replaced"/>
<xsl:param name="replacement"/>
<xsl:choose>
<xsl:when test="not(contains($input, $to-be-replaced))">
<xsl:value-of select="$input"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="substring-before($input, $to-be-replaced)"/>
<xsl:copy-of select="$replacement"/>
<xsl:call-template name="replace">
<xsl:with-param name="input" select="substring-after($input, $to-be-replaced)"/>
<xsl:with-param name="to-be-replaced" select="$to-be-replaced"/>
<xsl:with-param name="replacement" select="$replacement"/>
</xsl:call-template>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>