XSLT在标记内创建带有计数器的XML标记

时间:2013-09-26 18:33:23

标签: xml xslt

感谢您的回复。

很抱歉不清楚这个问题。

我创建了XSLT,如下所示。

`     

<xsl:output indent="yes"/>

<xsl:template match="/"> 
      <DataElementsList>
      <xsl:for-each select="//BC4JDataElementTransferObject">
       <xsl:variable name="index" select="count(preceding-sibling::BC4JDataElementTransferObject)+1" />
         <DataElement>
             <PUBLICID>
              <xsl:value-of select="//BC4JDataElementTransferObject[$index]/@public-id"/>
          </PUBLICID>
            <LONGNAME>
              <xsl:value-of select="//BC4JDataElementTransferObject[$index]/long-name"/>
          </LONGNAME>  
         </DataElement>  
      </xsl:for-each>                                                                
    </DataElementsList>
 </xsl:template>

`

到目前为止,我已将输出作为XML文件输出如下。

<?xml version="1.0" encoding="UTF-8"?>    
<DataElementsList>
   <DataElement>
      <PUBLICID>2183222</PUBLICID>
      <LONGNAME>Alpha DVG Blood Pressure, Diastolic</LONGNAME>
   </DataElement>
   <DataElement>
     <PUBLICID>7777777</PUBLICID>
     <LONGNAME>Alpha DVG Blood Pressure, Diastolic</LONGNAME>
   </DataElement>
</DataElementsList>

我想让可重复的标签有反击。请看下面的示例。

<?xml version="1.0" encoding="UTF-8"?>    
<DataElementsList>
   <DataElement num="1">
      <PUBLICID>2183222</PUBLICID>
      <LONGNAME>Alpha DVG Blood Pressure, Diastolic</LONGNAME>
   </DataElement>
   <DataElement num="2">
     <PUBLICID>7777777</PUBLICID>
     <LONGNAME>Alpha DVG Blood Pressure, Diastolic</LONGNAME>
   </DataElement>
</DataElementsList>

从我的XSLT,我如何创建“数据元素”标签,当我运行转换时,我的输出XML将在标签内部有计数器?

3 个答案:

答案 0 :(得分:1)

如果我正确理解了这个问题,你只想为每个包含“index”变量值的“DataElement”节点添加一个“num”属性。

如果在XSLT中替换此元素:

<DataElement>

使用此元素:

<DataElement num="{$index}">

然后你应该得到你在例子中提供的输出。

答案 1 :(得分:1)

不知道您的XML是什么样的,我将在该部分做出一些假设。但是,基本思想仍然有效。这就是您需要做的就是使用position()来创建索引。

我意识到这种情况与您目前的情况略有不同,但应该更有效并产生更好的结果。

所以如果你采用这个XML

<root>
  <BC4JDataElementTransferObject/>
  <BC4JDataElementTransferObject/>
  <BC4JDataElementTransferObject/>
  <BC4JDataElementTransferObject/>
  <BC4JDataElementTransferObject/>
</root>

并将此XSL应用于它

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes" />

  <xsl:template match="/">
    <DataElementsList>
      <xsl:apply-templates select="//BC4JDataElementTransferObject"/>
    </DataElementsList>
  </xsl:template>

  <xsl:template match="BC4JDataElementTransferObject">
    <xsl:variable name="index" select="position()" />
    <DataElement num="{$index}">
      Content here
    </DataElement>
  </xsl:template>

</xsl:stylesheet>

你得到这个输出

<DataElementsList>
  <DataElement num="1">
      Content here
    </DataElement>
  <DataElement num="2">
      Content here
    </DataElement>
  <DataElement num="3">
      Content here
    </DataElement>
  <DataElement num="4">
      Content here
    </DataElement>
  <DataElement num="5">
      Content here
    </DataElement>
</DataElementsList>

答案 2 :(得分:1)

position() xsl:numberhttp://www.w3.org/TR/xslt#number)的另一种<DataElement> <xsl:attribute name="num"> <xsl:number/> </xsl:attribute> <!--additional content...--> </DataElement> 替代方案更灵活/更有能力。

示例:

{{1}}