开始与XSLT合作,那很有趣,我喜欢校长,虽然要花一点时间才能习惯。现在...我已经遇到了一个我想知道的问题,也许有人可以告诉我。
我有一个带有优先级的框。 优先级小的框首先出现。 这非常有效 。 但是, 我愿意将我的框放在行中, 并有行 1 & amp; 3 标记为奇数, 第 2 排标记为偶数( 我期望在真实工程中还会有更多行 ) 。
因此,我认为我应该能够使用 Fn:position () 函数。 不幸的是, 返回的位置是原始节点之一, 而不是由此产生的分解节点。 是否有办法解决这个问题?
XSLT样本暴露了问题:
<?xml version="1.0"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="body">
<xsl:apply-templates>
<xsl:sort select="@priority" data-type="number"/>
</xsl:apply-templates>
</xsl:template>
<xsl:template match="body/box">
<div class="box">
Box[<xsl:value-of select="count(preceding-sibling::box) + 1" />,<xsl:value-of select="position()"/>] = (<xsl:value-of select="@priority"/>)
<xsl:copy-of select="title"/></div>
</xsl:template>
</xsl:stylesheet>
还有一个输入的例子。两个应该首先出现,然后是三十八,最后是一。
<?xml version="1.0"?>
<body>
<box priority="103">
<title>This is box ONE</title>
</box>
<box priority="1">
<title>This is box TWO</title>
</box>
<box priority="12">
<title>This is box THREE</title>
</box>
</body>
然而,我期望职位()是1,2,3... 但这是产出:
<div class="box">
Box[2,4] = (1)
<title>This is box TWO</title>
</div>
<div class="box">
Box[3,6] = (12)
<title>This is box THREE</title>
</div>
<div class="box">
Box[1,2] = (103)
<title>This is box ONE</title>
</div>
方框方括号内的第二个数字是位置 () 。 我原以为是 1, 2, 3. 3, 但是我们可以看到, 我们得到4, 6, 2 这是原文件中节点的位置 (我不知道为什么是 x2, 当我用 xsl: for-each 标签测试时, 应该是 2, 3 和 1 ) 。
我用xmlpatrices (Qt 4.7) 和 xsltproc (libxml2, 这应该使用版本1.0, 代码与 1.0 兼容) 进行了测试, 两者返回相同的数字 。
那么... 这是XSLT的极限吗? 还是两个XSLT执行过程中的错误?
2012年5月27日<强>更新 < 2012年5月27日 强>
经确定, QXmlQuery (xmplatices) 是该特定情况下的折损解析器 。 位置 () 必须使用类似于 count( 默认秒数 : 框) + 1 code >, 而不是为每个或模板序列运行的正确索引来计算 。