我正在使用javax.xml.transform.Transformer.transform()通过xsl样式表将一个xml转换为另一个xml。我想以编程方式设置第一级孩子的排序,但我不确定如何去做。我已经检查了docs,但我不明白要使用哪种类型的属性/参数以及如何在sort中指定:
<xsl:sort select="*need to get property or parameter to here*"/>
我对其他想法持开放态度,但宁愿不将xml结果解析为w3c文档。
修改
为了澄清我想通过Transformer API为xsl:for-each
标签中的元素设置排序键和方向。
答案 0 :(得分:1)
此样式表:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:param name="pSortingBy" select="/root/@sorting"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="/root">
<xsl:copy>
<xsl:apply-templates select="node()|@*">
<xsl:sort select="*[name()=$pSortingBy]"/>
</xsl:apply-templates>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
使用此输入:
<root sorting="prop4">
<elem1>
<prop1>A</prop1>
<prop2>B</prop2>
<prop3>C</prop3>
<prop4>D</prop4>
<prop5>A</prop5>
</elem1>
<elem2>
<prop1>B</prop1>
<prop2>C</prop2>
<prop3>D</prop3>
<prop4>A</prop4>
<prop5>B</prop5>
</elem2>
<elem3>
<prop1>C</prop1>
<prop2>D</prop2>
<prop3>A</prop3>
<prop4>B</prop4>
<prop5>C</prop5>
</elem3>
</root>
输出:
<root sorting="prop4">
<elem2>
<prop1>B</prop1>
<prop2>C</prop2>
<prop3>D</prop3>
<prop4>A</prop4>
<prop5>B</prop5>
</elem2>
<elem3>
<prop1>C</prop1>
<prop2>D</prop2>
<prop3>A</prop3>
<prop4>B</prop4>
<prop5>C</prop5>
</elem3>
<elem1>
<prop1>A</prop1>
<prop2>B</prop2>
<prop3>C</prop3>
<prop4>D</prop4>
<prop5>A</prop5>
</elem1>
</root>
注意:您可以将pSortingBy
param定义为遵循XSLT处理器规范的任何元素名称。
编辑:我不是Java专家,但我认为你可以这样做:
javax.xml.transform.TransformerFactory transFact =
javax.xml.transform.TransformerFactory.newInstance( );
javax.xml.transform.Transformer trans = transFact.newTransformer(xsltSource);
trans.setParameter("pSortingBy", "prop5");
答案 1 :(得分:0)
它需要进入for-each或apply-templates,并指定要排序的表达式。
来自http://www.w3schools.com/xsl/el_sort.asp:
<xsl:for-each select="catalog/cd">
<xsl:sort select="artist"/>
<tr>
<td><xsl:value-of select="title"/></td>
<td><xsl:value-of select="artist"/></td>
</tr>
</xsl:for-each>