输入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>
答案 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。