具有属性的节点的位置

时间:2014-12-04 12:18:37

标签: xslt xpath attributes position nodes

如何在XSL中选择具有特定属性的节点的位置。

XML:

<document type="async" page="tabTabel">
 <tabs>
  <table>
   <row type="header">
    <column type="text">href</column>
    <column type="number">Mapnr.</column>
    <column type="mapposition">Nr.</column>
    <column type="text">Description</column>
    <column type="text">Document</column>
    <column type="date">Date</column>
   </row>

   <row type="data">
    <column><![CDATA[]]></column>
    <column><![CDATA[10]]></column>
    <column><![CDATA[17]]></column>
    <column><![CDATA[Documentation may 2013 .pdf]]></column>
    <column><![CDATA[Documentation may 2013 .pdf]]></column>
    <column><![CDATA[03-04-2014]]></column>
   </row>

  </table>
 </tabs>
</document>

当前无效的XSLT:

<xsl:template match="tabs//row[@type='data']>
 <xsl:variable name="mapnumber">
  <xsl:value-of select="../row[@type='header']/column[@type='mapposition'][position()]" />
 </xsl:variable>
</xsl:template>

我希望列的索引号/位置的类型为&#39; mapposition&#39;。我怎么能这样做?

2 个答案:

答案 0 :(得分:2)

尝试:

<xsl:variable name="mapnumber" select="count(../row[@type='header']/column[@type='mapposition']/preceding-sibling::column) + 1" />

鉴于您的编辑,您可能希望执行以下操作:

<xsl:template match="table">
    <xsl:variable name="mapnumber" select="count(row[@type='header']/column[@type='mapposition']/preceding-sibling::column) + 1" />
    <xsl:value-of select="row[@type='data']/column[$mapnumber]" />
</xsl:template>

答案 1 :(得分:0)

此示例可能对您有所帮助:

如果你有以下XML

<row type='header'>
<column type='text'>a</column>
<column type='mapposition'>b</column>
<column type='number'>c</column>
</row>

要获得column @type = 'mapposition'的位置,您可以使用此样式表:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:template match="row[@type='header']">
    <xsl:apply-templates select="column"/>
</xsl:template>

<xsl:template match="column">
    <xsl:if test="@type='mapposition'"><xsl:value-of select="position()"/></xsl:if>
</xsl:template>
</xsl:stylesheet>