我对XSLT很陌生。我在网上进行了大量的研究,但是找不到适合我个人情况的足够信息。
这就是我想要实现的目标: 我有一个包含10到15个部分的大型XML文档。结构或多或少如下所示:
<headerSection>
<!-- lots of stuff in here -->
</headerSection>
<containerSection>
<bodySection>
<container1>
<container2>
<identifier code="12345"/>
<!-- lots of stuff in here -->
</container2>
</container1>
<container1>
<container2>
<identifier code="98765"/>
<!-- lots of stuff in here -->
</container2>
</container1>
</bodySection>
</containerSection>
我有一个应用于此的XSL文件,以便输出样式化的HTML页面。
现在,我想要做的是以任意顺序呈现<bodySection>
的子项。确定顺序的标准是code
元素中的<identifier>
属性。
让我再次澄清,排序应该是任意的。
我知道我可以使用xsl:sort
指令执行此操作,但是我是一个巨大的XSL新手,而且我还没有从我发现的示例中得到如何使用它线上。
要点是我要生成一个样式化的HTML页面,而不是&#34;只是&#34;转换XML输入。
看起来最接近我尝试做的是这个片段:
<xsl:param name="pOrder" select="'professionalsection,educationalsection'"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*">
<xsl:sort select="string-length(
substring-before(
concat(',',$pOrder,','),
concat(',',name(),',')))"/>
</xsl:apply-templates>
</xsl:copy>
</xsl:template>
不幸的是,我不太确定如何在我的情况下使用它。
直觉上,我会尝试更改select="'professionalsection,educationalsection'"
中指出的值,但这是正确的方法吗?
非常感谢任何帮助!
更新
通过查看评论中发布的示例,我想出了这个。我希望它能更准确地描述我想要做的事情:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" omit-xml-declaration="yes" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<!-- identity transform -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="bodySection">
<xsl:variable name="sort-order">|98765|12345|</xsl:variable>
<xsl:copy>
<xsl:apply-templates select="@*|node()">
<xsl:sort select="string-length(substring-before($sort-order, concat('|', container1/container2/identifier/@code, '|')))" data-type="number" order="descending"/>
</xsl:apply-templates>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
上面的代码片段尚无法解决。我试图实现的结果如下:
<headerSection>
<!-- lots of stuff in here -->
</headerSection>
<containerSection>
<bodySection>
<container1>
<container2>
<identifier code="98765"/>
<!-- lots of stuff in here -->
</container2>
</container1>
<container1>
<container2>
<identifier code="12345"/>
<!-- lots of stuff in here -->
</container2>
</container1>
</bodySection>
</containerSection>
...交换元素container1
(及其子元素)。
答案 0 :(得分:1)
尝试:
<xsl:sort select="string-length(substring-before($sort-order, concat('|', container2/identifier/@code, '|')))" data-type="number" order="ascending"/>