XSLT创建带有计数器的XML标记
谢谢你的回复XSLT创建带有计数器的XML标记,xml,xslt,Xml,Xslt,谢谢你的回复 <xsl:output indent="yes"/> <xsl:template match="/"> <DataElementsList> <xsl:for-each select="//BC4JDataElementTransferObject"> <xsl:variable name="index" select="count(preceding-sibling::BC4JData
<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>
对不起,我不清楚这个问题
<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>
我创建了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 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>
`
<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>
`
<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文件,如下所示
<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 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>
2183222
α-DVG舒张压
7777777
α-DVG舒张压
我想做一个可重复的标签,使其具有计数器。请参阅下面的示例
<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 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>
2183222
α-DVG舒张压
7777777
α-DVG舒张压
从我的XSLT中,如何创建“Data Element”标记,当我运行转换时,我的输出XML将在标记中包含计数器?如果我正确理解这个问题,您只需要向每个包含“index”变量值的“DataElement”节点添加一个“num”属性
<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>
如果在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>
<DataElement>
使用此元素:
<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>
<DataElement num="{$index}">
然后,您应该获得示例中提供的输出 如果我正确理解了这个问题,您只需要向包含“index”变量值的每个“DataElement”节点添加一个“num”属性
<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>
如果在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>
<DataElement>
使用此元素:
<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>
<DataElement num="{$index}">
然后,您应该获得示例中提供的输出 不知道您的XML是什么样子,我将对此做出一些假设。然而,基本思想仍然有效。也就是说,您所需要做的就是使用
position()
创建索引
<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>
我意识到这与你目前所做的有点不同,但应该更有效,产生更好的结果
<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
<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>
<root>
<BC4JDataElementTransferObject/>
<BC4JDataElementTransferObject/>
<BC4JDataElementTransferObject/>
<BC4JDataElementTransferObject/>
<BC4JDataElementTransferObject/>
</root>
并将此XSL应用于它
<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>
<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>
满足于此
你得到这个输出
<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>
<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>
满足于此
满足于此
满足于此
满足于此
满足于此
不知道您的XML是什么样子,我将对此做出一些假设。然而,基本思想仍然有效。也就是说,您所需要做的就是使用position()
创建索引
<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>
我意识到这与你目前所做的有点不同,但应该更有效,产生更好的结果
<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
<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>
<root>
<BC4JDataElementTransferObject/>
<BC4JDataElementTransferObject/>
<BC4JDataElementTransferObject/>
<BC4JDataElementTransferObject/>
<BC4JDataElementTransferObject/>
</root>
并将此XSL应用于它
<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>
<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>
满足于此
你得到这个输出
<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>
<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>
满足于此
满足于此
满足于此
满足于此
满足于此
另一个比position()
更灵活/更有能力的替代方法是xsl:number
()
<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>
例如:
<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>
<DataElement>
<xsl:attribute name="num">
<xsl:number/>
</xsl:attribute>
<!--additional content...-->
</DataElement>
另一个比
position()
更灵活/更有能力的替代方法是xsl:number
()
<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>
例如:
<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>
<DataElement>
<xsl:attribute name="num">
<xsl:number/>
</xsl:attribute>
<!--additional content...-->
</DataElement>
………您到底想知道什么…你到底想知道什么?是的,就是这个。非常感谢你。对不起,我的问题不清楚。我很难添加我的代码。@user2654219-您可以只做num=“{$index}”
,而不是num=“{position()}”
。这将允许您完全删除xsl:variable
。是的,就是这样。非常感谢你。对不起,我的问题不清楚。我很难添加我的代码。@user2654219-您可以只做num=“{$index}”
,而不是num=“{position()}”
。这将允许您完全删除xsl:variable
。如果时间允许,请结束此问题,以便其他有类似问题的人可以看到这些解决方案是成功的,谢谢。很高兴它对您有效。如果时间允许,请结束此问题,以便其他有类似问题的人可以看到这些解决方案是成功的,谢谢。