所选元素的XSLT位置

时间:2015-01-07 17:12:17

标签: xml xslt

我想显示所选节点的位置。

XSLT:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:call-template name="Convert"></xsl:call-template>

    <xsl:template name="Convert">
        <Pos>
            <Type><xsl:value-of select="type"/></Type>
            <LineNumber><xsl:value-of select="position()"/></LineNumber>
            ...
        </Pos>
    </xsl:template>
</xsl:stylesheet>

我的xml是:

<OrderPositions>
    <Pos>
         <Type>simple</Type>
         <LineNumber>1</LineNumber>
         ...
    </Pos>
    <Pos>
         <Type>complex</Type>
         <LineNumber>2</LineNumber>
         ...
    </Pos>
    <Pos>
         <Type>simple</Type>
         <LineNumber>3</LineNumber>
         ...
    </Pos>
    <Pos>
         <Type>complex</Type>
         <LineNumber>4</LineNumber> 
         ...
    </Pos>
</OrderPositions>

尝试使用<xsl:choose> + <xsl:when test="type='simple'">排除xslt中的“复杂”类型, LineNumber 1,3,5,7等等。是选择“简单”(删除“复杂”)类型并显示1,2,3,4等位置的正确方法吗?

2 个答案:

答案 0 :(得分:2)

默认情况下,您可以使用标识转换将所有节点复制到输出,修改为抑制复杂Pos元素并输出LineNumber元素,其值设置为前面所有简单的计数Pos元素

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:output method="xml" indent="yes"/>

  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="Pos[Type = 'complex']"/>

  <xsl:template match="LineNumber">
    <xsl:copy>
      <xsl:value-of select="count(preceding::Pos[Type = 'simple']) + 1"/>
    </xsl:copy>
  </xsl:template>

</xsl:stylesheet>

然后您的输出将是:

<?xml version="1.0" encoding="UTF-8"?>
<OrderPositions>
  <Pos>
      <Type>simple</Type>
      <LineNumber>1</LineNumber>
    ...
  </Pos>

  <Pos>
      <Type>simple</Type>
      <LineNumber>2</LineNumber>
    ...
  </Pos>

</OrderPositions>

答案 1 :(得分:1)

您也可以使用xsl:number ...

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output indent="yes"/>
    <xsl:strip-space elements="*"/>

    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="Pos[Type='complex']"/>

    <xsl:template match="LineNumber">
        <xsl:copy>
            <xsl:number count="Pos[Type='simple']"/>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>