具有预定义顺序的 xslt 分组
xslt grouping with predefined order
我正在查看使用 xslt 进行分组的 Muenchian 方法,
数据类似这样
<Root>
<Entries>
<Entry Attribute="A"/>
<Entry Attribute="B"/>
<Entry Attribute="C"/>
</Entries>
</Root>
但除此之外,我还需要有一个预定义的排序顺序 - 关于我的元素的属性。所以我正在考虑在 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>
但我还没有让它工作。关于如何实现这一目标的任何提示?我在正确的轨道上吗?我怀疑我在 的上下文中通过变量循环关闭了处理器,但我不知道如何更正它。
这是一个通用示例,您可以将其用作指南:
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
变量用于 return 输入 XML 文档的上下文。
我正在查看使用 xslt 进行分组的 Muenchian 方法,
数据类似这样
<Root>
<Entries>
<Entry Attribute="A"/>
<Entry Attribute="B"/>
<Entry Attribute="C"/>
</Entries>
</Root>
但除此之外,我还需要有一个预定义的排序顺序 - 关于我的元素的属性。所以我正在考虑在 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>
但我还没有让它工作。关于如何实现这一目标的任何提示?我在正确的轨道上吗?我怀疑我在
这是一个通用示例,您可以将其用作指南:
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
变量用于 return 输入 XML 文档的上下文。