xsl 中的条件自动增量
我有一个像这样的 XML:
<V>
<W>
<X>1</X>
</W>
<W>
<Y>1</Y>
</W>
<W>
<X>1555</X>
</W>
<W>
<X>1</X>
</W>
</V>
我想让它像这样:
<entity ID="start">
<f ID="NewField">0001</f>
<f ID="NewField">0001</f>
<f ID="NewField">0002</f>
<f ID="NewField">0003</f>
</entity>
当字段为 V/W/X 时,NewField
应该增加 1,就像标签 V/W/X 的次数一样成立。 V/W/Y 也类似。
我正在使用的 XSL 是
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<entity ID="start">
<xsl:for-each select="V/W">
<xsl:if test="X">
<xsl:variable name="my_var">
<xsl:value-of select="concat('000',position())"/>
</xsl:variable>
<f ID="NewField"><xsl:value-of select="$my_var"/></f>
</xsl:if>
<xsl:if test="Y">
<xsl:variable name="my_var">
<xsl:value-of select="concat('000',position())"/>
</xsl:variable>
<f ID="NewField"><xsl:value-of select="$my_var"/></f>
</xsl:if>
</xsl:for-each>
</entity>
</xsl:template>
</xsl:stylesheet>
,但它给了我一个错误的结果,如下所示:
<entity ID="start">
<f ID="NewField">0001</f>
<f ID="NewField">0002</f>
<f ID="NewField">0003</f>
<f ID="NewField">0004</f>
</entity>
I have an XML like this:
<V>
<W>
<X>1</X>
</W>
<W>
<Y>1</Y>
</W>
<W>
<X>1555</X>
</W>
<W>
<X>1</X>
</W>
</V>
I want to make it something like this:
<entity ID="start">
<f ID="NewField">0001</f>
<f ID="NewField">0001</f>
<f ID="NewField">0002</f>
<f ID="NewField">0003</f>
</entity>
When the field is V/W/X then NewField
should be incremented by 1 as many times the tag V/W/X is found.
Similarly for V/W/Y.
The XSL which I am using is
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<entity ID="start">
<xsl:for-each select="V/W">
<xsl:if test="X">
<xsl:variable name="my_var">
<xsl:value-of select="concat('000',position())"/>
</xsl:variable>
<f ID="NewField"><xsl:value-of select="$my_var"/></f>
</xsl:if>
<xsl:if test="Y">
<xsl:variable name="my_var">
<xsl:value-of select="concat('000',position())"/>
</xsl:variable>
<f ID="NewField"><xsl:value-of select="$my_var"/></f>
</xsl:if>
</xsl:for-each>
</entity>
</xsl:template>
</xsl:stylesheet>
but it gives me a wrong result, something like this:
<entity ID="start">
<f ID="NewField">0001</f>
<f ID="NewField">0002</f>
<f ID="NewField">0003</f>
<f ID="NewField">0004</f>
</entity>
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
如果您想使用 XSLT 对节点进行编号,那么 xsl:number 元素 可以提供帮助:
If you want to number nodes with XSLT then the xsl:number element can help:
我认为您正在寻找类似
count(preceding::X)
表达式的内容。当然,您可能想让它变得更复杂,然后注意数字格式,但这听起来像是您正在寻找的起点。I think you're looking for something like
count(preceding::X)
expression. Of course you may want to make it more complex and then take care about number formatting, but that sounds like a starting point you're looking for.这:
选择与当前元素同名的所有前面的元素。例如,如果执行点在此节点上:
它会向上一级 (
parent::W
),然后选择所有前面的
同级,并且它选择名称为X
的任何子级 (*
) - 因为X
是current()< /代码> 元素。
对所得节点集进行计数并加一。
format-number()
用于生成漂亮干净的输出:This:
selects all preceding elements of the same name as the current element. E.g., if the point of execution is on this node:
It goes one level up (
parent::W
), then selects all preceding<W>
siblings, and of those it selects any child (*
) that has a name ofX
- sinceX
is the name of thecurrent()
element.The resulting node-set is counted and incremented by one.
format-number()
is used to generate a nice clean output: