English 中文(简体)
XSLT, 排序和位置 ()
原标题:XSLT, sorting, and position()

开始与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 , 而不是为每个或模板序列运行的正确索引来计算 。

问题回答

嗯,你这样做

<xsl:apply-templates>
  <xsl:sort select="@priority" data-type="number"/>
</xsl:apply-templates>

简称缩写

<xsl:apply-templates select="node()">
  <xsl:sort select="@priority" data-type="number"/>
</xsl:apply-templates>

处理所有类型的子节点, 您似乎感兴趣的元素节点, 以及元素之间的白色空格文本节点。 所以使用

<xsl:apply-templates select="box">
  <xsl:sort select="@priority" data-type="number"/>
</xsl:apply-templates>

并且您至少应该拥有 1,2,3,3的岗位。

无论值多少, 我用样式表在 Windows 上测试了 xsltproc

<?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 select="box">
      <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>

相对于您所输入的输入,结果为

compilation error: file test2012052702.xsl line 2 element stylesheet
xsl:version: only 1.0 features are supported
<?xml version="1.0"?>
<div class="box">
Box[2,1] = (1)
  <title>This is box TWO</title></div><div class="box">
Box[3,2] = (12)
  <title>This is box THREE</title></div><div class="box">
Box[1,3] = (103)
  <title>This is box ONE</title></div>

所以我认为这个位置是正确的。

< 坚固 > 不能反向 < / 坚固 > 。

我用萨克森9.1.07来测试你的转变结果 结果就是:

<div class="box">
      Box[2,5] = (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,7] = (103)
      <title>This is box ONE</title></div>

" 强 " 表示,这些位置是正确的

XQSharp (Xmlprime) 产生同样的结果。

AltovaXML2009 (XML-SPY) 生成甚至此 :

<?xml version="1.0" encoding="UTF-8"?><div class="box">
    Box[2,1] = (1)
      <title>This is box TWO</title></div><div class="box">
    Box[3,2] = (12)
      <title>This is box THREE</title></div><div class="box">
    Box[1,3] = (103)
      <title>This is box ONE</title></div>

意思是它使用一个 XML 解析器,该解析器可以脱去仅空空空文本节点。

<% 1> 这一变换的改进版本将排除只有白色空格节点 :

<xsl:stylesheet version="2.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="body">
        <xsl:apply-templates>
          <xsl:sort select="@priority" data-type="number"/>
        </xsl:apply-templates>
 </xsl:template>

 <xsl:template match="box">
    <div class="box">
      Box[<xsl:value-of select="count(preceding-sibling::box) + 1" />
      <xsl:text>,</xsl:text>
      <xsl:value-of select="position()"/>
      <xsl:text>] = (</xsl:text>
      <xsl:value-of select="@priority"/>)
      <xsl:copy-of select="title"/></div>
 </xsl:template>
</xsl:stylesheet>

在对所提供的 XML 文档: 应用此转换时 < 强> 。

<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>

the wanted, 正确的结果产生 :

<div class="box">
      Box[2,1] = (1)
      <title>This is box TWO</title>
</div>
<div class="box">
      Box[3,2] = (12)
      <title>This is box THREE</title>
</div>
<div class="box">
      Box[1,3] = (103)
      <title>This is box ONE</title>
</div>

notes : xsl:strip-space 被用来排除只使用白色空间的节点,即使无法进行解析。

<强度 > 结论 :所报告的结果要么是由于使用了臭虫XSLT处理器,要么是因为进行了不同于所提供的转换。





相关问题
How do I sort enum members alphabetically in Java?

I have an enum class like the following: public enum Letter { OMEGA_LETTER("Omega"), GAMMA_LETTER("Gamma"), BETA_LETTER("Beta"), ALPHA_LETTER("Alpha"), private final String ...

Grokking Timsort

There s a (relatively) new sort on the block called Timsort. It s been used as Python s list.sort, and is now going to be the new Array.sort in Java 7. There s some documentation and a tiny Wikipedia ...

Sorting twodimensional Array in AS3

So, i have a two-dimensional Array of ID s and vote count - voteArray[i][0] = ID, voteArray[i][1] = vote count I want the top 3 voted items to be displayed in different colors, so i have a 2nd Array -...

Linq operations against a List of Hashtables?

I m working with a set of legacy DAO code that returns an IList, where each Hashtable represents the row of a dynamically executed SQL query. For example, the List might contain the following records/...

C++ Array Sort Me

Stuck on an array sorter. Have to sort numbers from largest to smallest. I m trying two loops (one nested in the other). Here s the code: int counter=0; // inner counter int counter2=0; // outer ...

Can I Nest OrderBy in .NET?

This doesn t seem to work as I intend. VB.NET: Dim x = Model.Discussions.OrderByDescending(Function(d) d.Messages.OrderByDescending(Function(m) m.Sent).First.Sent) For Each d As Discussion In x ....

sorting elements javascript

I m looking for a way to sort my elements, but it isn t as easy as it sounds. Please let me explain My elements are grouped per 6 elements (thumbnails), each x represents a thumbnail However all ...