我有以下XML,我想同时匹配恒星和行星:
<stars>
<star>sss1</star>
<star>sss2</star>
<planet>ppp1</planet>
<star>sss3</star>
<planet>ppp2</planet>
<star>sss4</star>
</stars>
我想选择星形节点的位置而不考虑行星节点。例如。如果我在星上使用position(),将会得到以下信息:
1:sss1
2:sss2
4:sss3
6:sss4
我只想选择星的position(),这样我得到:
1:sss1
2:sss2
3:sss3
4:sss4
使用position()函数时是否可以丢弃其他节点?
这是我正在使用的代码:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:strip-space elements="*"/>
<xsl:template match="stars">
<xsl:apply-templates />
</xsl:template>
<xsl:template match="star">
<xsl:element name="h2">
<xsl:attribute name="class">
<xsl:value-of select="position()" />
<xsl:attribute>
</xsl:element>
</xsl:template>
<xsl:template match="planet">
<!-- do something else -->
</xsl:template>
</xsl:stylesheet>
在代码上下文中,我必须匹配出现的恒星和行星。我不能例如:
<xsl:template match="/">
<xsl:apply-templates select="star"/>
<xsl:apply-templates select="planet"/>
</xsl:template>
答案 0 :(得分:0)
使用position()函数时是否可以丢弃其他节点?
否,但是有一种选择时可以丢弃其他节点的方法。例如:
XSLT 1.0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" encoding="UTF-8" />
<xsl:template match="/stars">
<xsl:for-each select="star">
<xsl:value-of select="position()" />
<xsl:text>: </xsl:text>
<xsl:value-of select="." />
<xsl:text> </xsl:text>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
结果
1: sss1
2: sss2
3: sss3
4: sss4
或者,如果重要的是按原始顺序处理所有元素 ,则可以使用xsl:number
代替position()
-例如:
XSLT 1.0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" encoding="UTF-8" />
<xsl:template match="/stars">
<xsl:for-each select="*">
<xsl:number/>
<xsl:text>: </xsl:text>
<xsl:value-of select="." />
<xsl:text> </xsl:text>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
结果
1: sss1
2: sss2
1: ppp1
3: sss3
2: ppp2
4: sss4