所选元素的 XSLT 位置

XSLT position of chosen elements

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

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 中的“complex”类型给出 LineNumber 1, 3,5,7 等。什么是只选择“simple”(删除“complex”)类型并显示其位置的正确方法1,2,3,4 等等?

默认情况下,您可以使用身份转换将所有节点复制到输出,修改为抑制复杂的 Pos 元素并输出 LineNumber 元素,并将值设置为 count所有前面的简单 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>

您也可以使用 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>