首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用xslt-3使xml元素成为唯一

使用xslt-3使xml元素成为唯一
EN

Stack Overflow用户
提问于 2018-08-03 12:19:00
回答 1查看 45关注 0票数 0

给定以下示例xml,如何使记录ID元素和TITLEID具有唯一值,从值1开始,并继续进行?

代码语言:javascript
复制
<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>

预期结果:

代码语言:javascript
复制
  <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属性,但我没有成功地使它正常工作。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-08-04 09:28:26

使用累加器(https://www.w3.org/TR/xslt-30/#element-accumulator)的XSLT 3解决方案位于https://xsltfiddle.liberty-development.net/6qVRKwn/0并执行

代码语言:javascript
复制
<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中那样:

代码语言:javascript
复制
<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>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51672478

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档