【问题标题】:Selecting from xml specifying an order从 xml 中选择指定订单
【发布时间】:2015-12-13 16:23:25
【问题描述】:

在 python 上使用 xslt 1.0,我试图在指定顺序时选择一些项目:

<?xml version="1.0" encoding="UTF-8"?>
<items>
<item name='1'>
first
</item>
<item name='2'>
second
</item>
<item name='3'>
third
</item>
</items>

如果我使用带有大 OR'd together 列表的 for-each,我可以获得我想要的项目,但只能按照上面 xml 源文档的原始顺序。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
  <html>
  <body>
        <xsl:for-each select="items/item[@name='2']|items/item[@name='1']">
<p>hi</p>
<xsl:value-of select="." />
</xsl:for-each>
  </body>
  </html>
    </xsl:template>
</xsl:stylesheet>

这会产生:

hi
first
hi
second

但我想让它输出:

hi
second
hi
first

我认为使用 xsl:apply-templates 可能是可行的方法,但即使是这个简单的示例,我也无法使用它。 xslt 1.0 中按特定顺序选择元素的最佳方式是什么?

【问题讨论】:

  • 查看 har07 给您的答案(与两个 apply-templates),您使用的联合运算符 | 按文档顺序对其操作数进行排序,因此您对 select="items/item[@name='2']|items/item[@name='1']" 的尝试未定义顺序for-each,随心所欲。在 XSLT 2.0 中,您可以使用逗号运算符 ,,就像在 select="items/item[@name='2'],items/item[@name='1']" 中一样,但 XSLT 1.0 没有该运算符。

标签: python xml xslt xslt-1.0


【解决方案1】:

您可以使用&lt;xsl:sort&gt; 指定排序,尤其是当有定义排序的特定逻辑时,例如按name 属性值降序排序:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">  
  <xsl:template match="/"> 
    <html> 
      <body> 
        <xsl:for-each select="items/item[@name='2' or @name='1']"> 
          <xsl:sort select="@name" data-type="number" order="descending"/>
          <p>hi</p>  
          <xsl:value-of select="."/> 
        </xsl:for-each> 
      </body> 
    </html> 
  </xsl:template> 
</xsl:stylesheet>

xsltransform demo 1

“我认为使用 xsl:apply-templates 可能是可行的方法,但即使是这个简单的示例,我也无法使用它”

这也是可能的,例如:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">  
  <xsl:template match="/"> 
    <html> 
      <body> 
        <xsl:apply-templates select="items/item[@name='2']"/>
        <xsl:apply-templates select="items/item[@name='1']"/>
      </body> 
    </html> 
  </xsl:template> 

  <xsl:template match="items/item">
      <p>hi</p>  
      <xsl:value-of select="."/> 
  </xsl:template>
</xsl:stylesheet>

xsltransform demo 2

输出:

<html>
   <body>
      <p>hi</p>
      second

      <p>hi</p>
      first

   </body>
</html>

【讨论】:

  • xsl:apply-templates 对我来说是最好的解决方案(排序不是因为顺序是任意的)。对我来说,大多数问题都是错字和节点集相关的。 xmltransform.net 的链接非常棒。比我使用的其他在线 xslt 工具要好得多。
猜你喜欢
  • 1970-01-01
  • 2017-10-14
  • 2010-12-10
  • 2018-01-06
  • 1970-01-01
  • 2013-01-26
  • 1970-01-01
  • 1970-01-01
  • 2020-04-01
相关资源
最近更新 更多