Xml 处理同级节点并标记为已处理
实际上,我面临着解析XML元素的问题,条件如下:; --总列数为4,如果元素节点的总hspan数为4,则将其视为一行。例如,元素1,2作为行,3,4作为行,5也应作为行处理Xml 处理同级节点并标记为已处理,xml,xslt,Xml,Xslt,实际上,我面临着解析XML元素的问题,条件如下:; --总列数为4,如果元素节点的总hspan数为4,则将其视为一行。例如,元素1,2作为行,3,4作为行,5也应作为行处理 <elements cols="4"> <element hspan="1" text= "text1"/> <element hspan="3" text= "text2"/> <element hspan="2" text= "text3"/> <element hs
<elements cols="4">
<element hspan="1" text= "text1"/>
<element hspan="3" text= "text2"/>
<element hspan="2" text= "text3"/>
<element hspan="2" text= "text4"/>
<element hspan="4" text= "text5"/>
</elements>
有时元素没有HSPAN,在这种情况下,元素应该被考虑为1并且继续进行下去。
<elements cols="4">
<element text= "text1"/>
<element hspan="3" text= "text2"/>
<element hspan="2" text= "text3"/>
<element hspan="2" text= "text4"/>
<element hspan="4" text= "text5"/>
</elements>
如果我在xslt中进行循环以获取下一个同级节点,我怎么能忽略已经处理的元素呢
预期结果为:
<row>
<cells>
<label text = text1>
<label text = text2>
</cells>
</row>
<row>
<cells>
<label text = text3>
<label text = text4>
</cells>
</row>
<row>
<cells>
<label text = text5>
</cells>
</row>
注意:我使用的是XSLT2.0。
我真的非常感谢你的帮助。
当做
Jaji假设相关的
@hspan
属性的所有计数始终精确地符合所需的列数,您可以按如下方式对元素进行分组:
<xsl:for-each-group select="element" group-starting-with="*[sum(preceding-sibling::element/@hspan) mod $cols = 0]">
请公布预期结果另外,当元素1和2的总跨度为4时,为什么元素1、2和3会在同一行?现在还不清楚当已经有3个元素而下一个元素为2时会发生什么。@Michael-实际上,hspan中定义了元素占用的列数。有时,每个元素的值为1,这意味着每个元素只占用一列。一个有超过20个元素,这就是为什么我想用动态(循环或其他)的方式来做它。我真的很感谢你的帮助。恐怕你已经失去了我。我在问你怎么分3,1,3,2。啊。。。我抓到你了。。不,这在我的xml中是不可能的。元素以不减少cols数量的方式出现。非常好,非常感谢,您的解决方案解决了我的问题。在我的问题中,我只遗漏了一件事,即某些时间元素没有“hspan”。在这种情况下,元素应该被考虑为HSPAN=“1”。请你也提出解决这个问题的办法好吗。当前,每当我解析包含不带hspan的元素的xml元素时,如“”,都无法获得所需的结果。请将代码更改为
@Martin-谢谢,但我收到一个意外标记']'的错误:(我在智能手机上打字,所以很难获得正确的括号,请尝试
现在没有编译器错误,但每当我传输xml时都会得到以下错误:路径表达式中的混合内容“XPTY0018:路径表达式的最后一步可能不同时包含节点和原子值”
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:output method="xml" indent="yes" />
<xsl:template match="elements">
<xsl:variable name="cols" select="@cols" />
<xsl:for-each-group select="element" group-starting-with="*[sum(preceding-sibling::element/@hspan) mod $cols = 0]">
<row>
<cells>
<xsl:apply-templates select="current-group()" />
</cells>
</row>
</xsl:for-each-group>
</xsl:template>
<xsl:template match="element">
<label text="{@text}" />
</xsl:template>
</xsl:stylesheet>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"
xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs">
<xsl:output method="xml" indent="yes" />
<xsl:template match="elements">
<xsl:variable name="cols" select="@cols" />
<xsl:for-each-group select="element" group-starting-with="*[sum(preceding-sibling::element/xs:decimal((@hspan,1)[1])) mod $cols = 0]">
<row>
<cells>
<xsl:apply-templates select="current-group()" />
</cells>
</row>
</xsl:for-each-group>
</xsl:template>
<xsl:template match="element">
<label text="{@text}" />
</xsl:template>
</xsl:stylesheet>