行计数,包括转换节点
Posted
技术标签:
【中文标题】行计数,包括转换节点【英文标题】:Row counting including transformed nodes 【发布时间】:2021-11-19 01:20:32 【问题描述】:我需要正确的行计数(在属性pos
="1"、"2" 等中)用于从其子元素部分转换的line
元素节点。
XSLT 代码的当前 counting-part 无法正常工作。我还尝试创建一个变量模板来计算所需的节点,但到目前为止该变量是无用的,因为尚不完全清楚如何在下一步中应用它。
源 XML
<?xml version="1.0" encoding="UTF-8"?>
<entry>
<line id="001" att1="aaa" att2="bbb" att3="ccc"/>
<line id="002" att1="ddd" att2="eee" att3="fff"/>
<line id="003" att1="ggg" att2="hhh" att3="iii">
<subline x="name" z="lastname"/>
<subline x="name2" z="lastname2"/>
<underline a="bar" b="foo"/>
</line>
</entry>
期望的输出(无论如何pos=
在属性中的位置可以是任意的)
<?xml version="1.0" encoding="UTF-8"?><entry>
<entry>
<line pos="1" id="001" att1="aaa" att2="bbb" att3="ccc"/>
<line pos="2" id="002" att1="ddd" att2="eee" att3="fff"/>
<line pos="3" id="003" att1="ggg" att2="hhh" att3="iii" x="name" z="lastname"/>
<line pos="4" id="003" att1="ggg" att2="hhh" att3="iii" x="name2" z="lastname2"/>
<line pos="5" id="003" att1="ggg" att2="hhh" att3="iii" a="bar" b="foo"/>
</entry>
提供 XSLT 代码
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="line[*]">
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="/">
<xsl:for-each select="entry/line">
<xsl:variable name="pos" select="position()" />
</xsl:for-each>
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="line/*">
<line pos="position()">
<xsl:copy-of select="../@* | @*"/>
</line>
</xsl:template>
</xsl:stylesheet>
【问题讨论】:
请解释一下跳过数字4的逻辑。 只是一个错误。谢谢,已更正 【参考方案1】:怎么样:
XSLT 1.0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:template match="/entry">
<xsl:copy>
<xsl:for-each select="line[not(*)] | line/*">
<line pos="position()">
<xsl:copy-of select="parent::line/@* | @*"/>
</line>
</xsl:for-each>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
【讨论】:
以上是关于行计数,包括转换节点的主要内容,如果未能解决你的问题,请参考以下文章