所选元素的 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>
我想显示所选节点的位置。
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>