我想显示所选节点的位置。
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等位置的正确方法吗?
答案 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>