Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.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 - Fatal编程技术网

Xml 选择位于相同位置的不同父元素

Xml 选择位于相同位置的不同父元素,xml,xpath,Xml,Xpath,假设我有以下XML片段 <line> <data> <p>5<p/> <p>40<p/> <p>30<p/> <p>25<p/> </data> <attData> <att> </att> <att> <type>

假设我有以下XML片段

<line>
  <data>
    <p>5<p/>
    <p>40<p/>
    <p>30<p/>
    <p>25<p/>
  </data>
  <attData>
     <att>
     </att>
     <att>
       <type>
         <n/>
         <value>no use</value>    
       </type>
     </att>
     <att>
       <type>
         <n/>
         <value>use</value>    
       </type>
     </att>
     <att>
       <type>
         <n/>
         <value>no use</value>    
       </type>
     </att>
  </attData>
</line>
我试图避免使用变量作为位置,因为我需要将表达式用于排序选择。 我有:

 <xsl:for-each select="*/line/attData/att[not(type[value='no use'])]">
选择所需的att元素 其中:

  <xsl:value-of select= "count(preceding-sibling::*)+1"/>
从attData提供att的文档顺序,但我不知道如何匹配此顺序并选择所需的p元素。 任何帮助都将不胜感激,我对这方面还比较陌生。 我使用的是XSLT1.0,您可以定义一个键

<xsl:key name="pos" match="line/data/p" use="concat(generate-id(../..), '|', count(preceding-sibling::p))"/>

这是糟糕的XML设计。
<xsl:key name="pos" match="line/data/p" use="concat(generate-id(../..), '|', count(preceding-sibling::p))"/>
<xsl:template match="line/attData/att[not(type[value='no use'])]">
  <xsl:apply-templates select="key('pos', concat(generate-id(../..), '|', count(preceding-sibling::att)))"/>
</xsl:template>
<xsl:for-each select="*/line/attData/att[not(type[value='no use'])]">
  <xsl:sort select="key('pos', concat(generate-id(../..), '|', count(preceding-sibling::att)))" data-type="number"/>
</xsl:for-each>