Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml 处理同级节点并标记为已处理_Xml_Xslt - Fatal编程技术网

Xml 处理同级节点并标记为已处理

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

实际上,我面临着解析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 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>