如何通过position()获取属性的位置

时间:2019-12-03 05:38:49

标签: xml xslt-2.0

输入XML:

<?xml version="1.0" encoding="UTF-8"?>
<xml>
    <p class="ABC">data</p>
    <p class="ABC">data</p>
    <p class="ABC">data</p>
    <p class="XYZ">data</p>
    <p class="XYZ">data</p>
    <p class="XYZ">data</p>
    <p class="ZXY">data</p>
    <p class="ZXY">data</p>
    <p class="ABC">data</p>
    <p class="ABC">data</p>
</xml>

我的例外是我想在属性值的帮助下创建元素名称,然后找到@class属性的位置:

<?xml version="1.0" encoding="UTF-8"?>
<root class="xml">
    <ABC no="1">data</ABC>
    <ABC no="2">data</ABC>
    <ABC no="3">data</ABC>
    <XYZ no="1">data</XYZ>
    <XYZ no="2">data</XYZ>
    <XYZ no="3">data</XYZ>
    <ZXY no="1">data</ZXY>
    <ZXY no="2">data</ZXY>
    <ABC no="4">data</ABC>
    <ABC no="5">data</ABC>
</root>

我的XSL代码,但我找不到@class属性的位置,请查看此内容。

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    exclude-result-prefixes="xs"
    version="2.0">

    <xsl:template match="/">
        <xsl:apply-templates/>
    </xsl:template>

    <xsl:template match="xml">
        <root>
            <xsl:attribute name="class" select="local-name()"/>
            <xsl:apply-templates/>
        </root>
    </xsl:template>

    <xsl:template match="p">
        <xsl:variable name="po" select="position()"/>
        <xsl:element name="{@class}">
            <xsl:attribute name="no">
                <xsl:value-of select="preceding-sibling::p/@class/[position()"/>
            </xsl:attribute>
            <xsl:apply-templates/>
        </xsl:element>
    </xsl:template>

</xsl:stylesheet>

1 个答案:

答案 0 :(得分:2)

您犯了一个错误,即假设您称为位置的概念(“属性的位置”)与position()函数的作用有关。仅仅因为他们具有相同的名字并不意味着他们就做同样的事情。

我会用xsl:number来做到这一点:

<xsl:template match="p">
    <xsl:element name="{@class}">
        <xsl:attribute name="no">
            <xsl:variable name="CLASS" select="@class"/>
            <xsl:number count="p[@class = $CLASS]"/>
        </xsl:attribute>
        <xsl:apply-templates/>
    </xsl:element>
</xsl:template>

未经测试。

请注意,您的问题是XY问题(https://en.wikipedia.org/wiki/XY_problem)的经典示例,在该问题中,您询问“如何使用Y函数?”而不是询问“如何实现X?”。实际情况并非如此,使用Y可以帮助您实现X。