给定以下示例xml,如何使记录ID元素和TITLEID具有唯一值,从值1开始,并继续进行?
<CATALOG>
<CD>
<RECORD ID="109">
<TITLEID>54</TITLEID>
<ARTIST>Bob Dylan</ARTIST>
<COUNTRY>USA</COUNTRY>
<COMPANY>Columbia</COMPANY>
<PRICE>10.90</PRICE>
<YEAR>1985</YEAR> </CD>
</RECORD>
<CD>
<RECORD ID="187">
<TITLEID>88</TITLEID>
<ARTIST>Bonnie Tyler</ARTIST>
<COUNTRY>UK</COUNTRY>
<COMPANY>CBS Records</COMPANY>
<PRICE>9.90</PRICE>
<YEAR>1988</YEAR> </CD>
</RECORD>
</CATALOG>预期结果:
<CATALOG>
<CD>
<RECORD ID="1">
<TITLEID>1</TITLEID>
<ARTIST>Bob Dylan</ARTIST>
<COUNTRY>USA</COUNTRY>
<COMPANY>Columbia</COMPANY>
<PRICE>10.90</PRICE>
<YEAR>1985</YEAR> </CD>
</RECORD>
<CD>
<RECORD ID="2">
<TITLEID>2</TITLEID>
<ARTIST>Bonnie Tyler</ARTIST>
<COUNTRY>UK</COUNTRY>
<COMPANY>CBS Records</COMPANY>
<PRICE>9.90</PRICE>
<YEAR>1988</YEAR> </CD>
</RECORD>
</CATALOG>我的尝试是使用xs:unique属性,但我没有成功地使它正常工作。
发布于 2018-08-04 09:28:26
使用累加器(https://www.w3.org/TR/xslt-30/#element-accumulator)的XSLT 3解决方案位于https://xsltfiddle.liberty-development.net/6qVRKwn/0并执行
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
version="3.0">
<xsl:mode on-no-match="shallow-copy" use-accumulators="cd-count"/>
<xsl:accumulator name="cd-count" as="xs:integer" initial-value="0">
<xsl:accumulator-rule match="CD" select="$value + 1"/>
</xsl:accumulator>
<xsl:template match="RECORD/@ID">
<xsl:attribute name="{name()}" select="..!accumulator-before('cd-count')"/>
</xsl:template>
<xsl:template match="RECORD/TITLEID">
<xsl:copy>
<xsl:value-of select="accumulator-before('cd-count')"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>经典的解决方案是使用xsl:number (https://www.w3.org/TR/xslt-30/#element-number),就像在https://xsltfiddle.liberty-development.net/6qVRKwn/1中那样:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
version="3.0">
<xsl:mode on-no-match="shallow-copy"/>
<xsl:template match="RECORD/@ID">
<xsl:attribute name="{name()}">
<xsl:number count="CD"/>
</xsl:attribute>
</xsl:template>
<xsl:template match="RECORD/TITLEID">
<xsl:copy>
<xsl:number count="CD"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>https://stackoverflow.com/questions/51672478
复制相似问题