Xml 选择位于相同位置的不同父元素
假设我有以下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>
<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>