xslt使用预定义顺序进行分组

时间:2015-12-22 23:22:41

标签: xslt xslt-1.0

我正在研究使用xslt进行分组的Muenchian方法,

数据与此类似

<Root>
  <Entries>
    <Entry Attribute="A"/>
    <Entry Attribute="B"/>
    <Entry Attribute="C"/>
  </Entries>
</Root>

但另外我需要有一个预定义的排序顺序 - 关于我的元素的atttributes。所以我正在寻找xslt中的自定义xml部分,并使用排序顺序将其插入到像这样的变量中

<xsl:variable name="sortorder"select="document('')/*/my:data/my:ordering/my:value"/>

值是例如C,B,A是订单,也是分组标题

然后我发现,不是在Muenchian方法中使用key()函数,我可以简单地遍历变量的值。

喜欢这个

<xsl:template match="Entries">
<xsl:for-each select="$sortorder/value">
  <groupheader><xsl:value-of select="."/></groupheader>

... 然后应用模板

<xsl:apply-templates select="Entry[@sortattribute=current()"></xsl:apply-templates> 

但我还没有把它付诸实践。有关如何实现这一目标的任何提示?我是在正确的轨道上吗?我怀疑我在&lt; Entry&gt;的上下文中循环使用变量抛出处理器,但我不知道如何纠正它。

1 个答案:

答案 0 :(得分:1)

这是一个可以用作指南的通用示例:

<强> XML

<input>
    <item category="Winter">Alpha</item>
    <item category="Autumn">Bravo</item>
    <item category="Spring">Charlie</item>
    <item category="Summer">Delta</item>
    <item category="Spring">Echo</item>
    <item category="Autumn">Foxtrot</item>
    <item category="Spring">Golf</item>
    <item category="Summer">Hotel</item>
    <item category="Winter">India</item>
    <item category="Autumn">Juliet</item>
    <item category="Summer">Kilo</item>
    <item category="Winter">Lima</item>
    <item category="Summer">Mike</item>
    <item category="Spring">November</item>
    <item category="Spring">Oscar</item>
    <item category="Autumn">Papa</item>
    <item category="Winter">Quebec</item>
    <item category="Summer">Romeo</item>
    <item category="Spring">Sierra</item>
    <item category="Summer">Tango</item>
    <item category="Spring">Uniform</item>
    <item category="Autumn">Victor</item>
    <item category="Summer">Whiskey</item>
    <item category="Winter">Xray</item>
    <item category="Summer">Yankee</item>
    <item category="Autumn">Zulu</item>
</input>

XSLT 1.0

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:my="http://www.example.com/my"
exclude-result-prefixes="my">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

<my:categories>
    <category>Spring</category>
    <category>Summer</category>
    <category>Autumn</category>
    <category>Winter</category>
</my:categories>

<xsl:variable name="root" select="/"/>

<xsl:template match="/">
    <output>
        <xsl:for-each select="document('')/xsl:stylesheet/my:categories/category">
            <group category="{.}">
                <xsl:apply-templates select="$root/input/item[@category=current()]"/>
            </group>
        </xsl:for-each> 
    </output>
</xsl:template>

<xsl:template match="item">
    <xsl:copy-of select="."/>
</xsl:template>

</xsl:stylesheet>

<强>结果

<?xml version="1.0" encoding="UTF-8"?>
<output>
   <group category="Spring">
      <item category="Spring">Charlie</item>
      <item category="Spring">Echo</item>
      <item category="Spring">Golf</item>
      <item category="Spring">November</item>
      <item category="Spring">Oscar</item>
      <item category="Spring">Sierra</item>
      <item category="Spring">Uniform</item>
   </group>
   <group category="Summer">
      <item category="Summer">Delta</item>
      <item category="Summer">Hotel</item>
      <item category="Summer">Kilo</item>
      <item category="Summer">Mike</item>
      <item category="Summer">Romeo</item>
      <item category="Summer">Tango</item>
      <item category="Summer">Whiskey</item>
      <item category="Summer">Yankee</item>
   </group>
   <group category="Autumn">
      <item category="Autumn">Bravo</item>
      <item category="Autumn">Foxtrot</item>
      <item category="Autumn">Juliet</item>
      <item category="Autumn">Papa</item>
      <item category="Autumn">Victor</item>
      <item category="Autumn">Zulu</item>
   </group>
   <group category="Winter">
      <item category="Winter">Alpha</item>
      <item category="Winter">India</item>
      <item category="Winter">Lima</item>
      <item category="Winter">Quebec</item>
      <item category="Winter">Xray</item>
   </group>
</output>

请注意使用$root变量将上下文返回到输入XML文档。