2

感谢您的答复。

很抱歉不清楚这个问题。

我创建了 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 将在标签内有计数器?

4

3 回答 3

2

不知道您的 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>
于 2013-09-26T21:38:30.773 回答
1

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

如果在 XSLT 中替换此元素:

<DataElement>

使用此元素:

<DataElement num="{$index}">

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

于 2013-09-26T21:06:31.937 回答
1

另一种position()更灵活/功能更强大的替代方法是xsl:numberhttp://www.w3.org/TR/xslt#number)。

例子:

<DataElement>
    <xsl:attribute name="num">
        <xsl:number/>
    </xsl:attribute>
    <!--additional content...-->
</DataElement>
于 2013-09-27T03:27:27.923 回答