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_Xpath_Xslt 2.0 - Fatal编程技术网

Xml 计算包含特定值的当前节点的前面同级

Xml 计算包含特定值的当前节点的前面同级,xml,xpath,xslt-2.0,Xml,Xpath,Xslt 2.0,我正在编写一个XSLT2.0样式表,将excel生成的xml文件转换为我自己的xml结构 生成的xml的结构如下所示: <Row><Cell><Data>##tablestart##</Data></Cell></Row> <Row> <Cell><Data>1</Data></Cell> <Cell><Data>ABC</

我正在编写一个XSLT2.0样式表,将excel生成的xml文件转换为我自己的xml结构

生成的xml的结构如下所示:

<Row><Cell><Data>##tablestart##</Data></Cell></Row>
<Row>
   <Cell><Data>1</Data></Cell>
   <Cell><Data>ABC</Data></Cell>
   <Cell><Data>DEF</Data></Cell>
   <Cell><Data>GHI</Data></Cell>
</Row>
<Row>
   <Cell><Data>2</Data></Cell>
   <Cell><Data>AC</Data></Cell>
   <Cell><Data>DF</Data></Cell>
   <Cell><Data>GI</Data></Cell>
</Row>
<Row>
   <Cell><Data>3</Data></Cell>
   <Cell><Data>AB</Data></Cell>
   <Cell><Data>DE</Data></Cell>
   <Cell><Data>GH</Data></Cell>
</Row>
<Row><Cell><Data>##tableclose##</Data></Cell></Row>
 some other rows I do not need...
<Row><Cell><Data>##tablestart##</Data></Cell></Row>...
##表启动##
1.
基础知识
DEF
GHI
2.
自动控制
DF
胃肠道
3.
AB
判定元件
生长激素
##桌面关闭##
其他一些我不需要的行。。。
##tablestart###。。。
这会重复多次

现在我想获取tablestart和tableclose之间的数据。 为此,我创建了一个包含所有行的数组,现在我想为每个元素添加一个属性,该属性确定它是否是数据元素(在tablestart和tableclose之间),并通过在下面的代码中检查该属性来处理它

问题:如何检查它是否在tablestart和tableclose之间


我期待着阅读您的回答:)

这似乎是一个可以用XSLT 2.0和
为每个组解决的问题,请选择“行”组,以“=“行[Cell/Data=”##tablestart##]]”开头。



如果第一个
可能没有
单元格/数据='########
,这意味着第一个“表”前面可能有
,那么需要在for each group中进行额外的检查。

您可以要求XSLT计算每行前面的开始和结束标记的数量。如果开始标记多于结束标记,则您位于数据行中:

  <xsl:for-each select="//Row">
    <xsl:if test="Cell/Data != '##tableclose##' and count(preceding-sibling::Row[Cell/Data='##tablestart##']) != count(preceding-sibling::Row[Cell/Data='##tableclose##'])">
      Found an internal row at <xsl:value-of select="position()"/>      
    </xsl:if>
  </xsl:for-each>

在中找到一个内部行

或者您可能希望使用group start with=“Row[Cell/Data=”(“#tablestart###,“##tableclose##”)”,然后使用xsl:选择在组内测试您是处理从“开始”开始的组还是从“结束”开始的组。
  <xsl:for-each select="//Row">
    <xsl:if test="Cell/Data != '##tableclose##' and count(preceding-sibling::Row[Cell/Data='##tablestart##']) != count(preceding-sibling::Row[Cell/Data='##tableclose##'])">
      Found an internal row at <xsl:value-of select="position()"/>      
    </xsl:if>
  </xsl:for-each>