如何通过javax.xml.transform.Transformer.transform()调用指定sortBy?

时间:2010-09-01 18:38:12

标签: java transform xslt

我正在使用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标签中的元素设置排序键和方向。

2 个答案:

答案 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>