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

发布于 2024-09-16 13:32:16 字数 536 浏览 3 评论 0原文

我正在使用 javax.xml.transform.Transformer.transform() 通过 xsl 样式表将一个 xml 转换为另一个 xml。我想以编程方式设置第一级儿童的排序,但不确定如何进行。我已经检查了 docs,但我不明白要使用哪种类型的属性/参数以及如何在排序中指定:

我对其他想法持开放态度,但不想将 xml 结果解析为 w3c 文档。

编辑: 为了澄清这一点,我希望通过 Transformer API 设置 xsl:for-each 标记中元素的排序键和方向。

I'm using javax.xml.transform.Transformer.transform() to convert one xml to another through an xsl stylesheet. I would like to programatically set the sorting of the first level of children, but am unsure how to go about it. I've checked out the docs, but I don't understand which type of property/parameter to use and how to specify in sort:

<xsl:sort select="*need to get property or parameter to here*"/>

I am open to other ideas, but would rather not parse the xml result into a w3c document.

Edit:
To clarify I am looking to set the sort key and direction for the elements in a xsl:for-each tag via the Transformer API.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

药祭#氼 2024-09-23 13:32:16

此样式表:

<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 参数定义为遵循 XSLT 处理器规范的任何元素名称。

编辑:我不是java专家,但我认为你可以这样做:

javax.xml.transform.TransformerFactory transFact =
                       javax.xml.transform.TransformerFactory.newInstance( );
javax.xml.transform.Transformer trans = transFact.newTransformer(xsltSource);
trans.setParameter("pSortingBy", "prop5");

This stylesheet:

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

With this input:

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

Output:

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

Note: You could define pSortingBy param to be any element name following specifications from your XSLT processor.

Edit: I'm not a java expert, but I think you could do:

javax.xml.transform.TransformerFactory transFact =
                       javax.xml.transform.TransformerFactory.newInstance( );
javax.xml.transform.Transformer trans = transFact.newTransformer(xsltSource);
trans.setParameter("pSortingBy", "prop5");
雨的味道风的声音 2024-09-23 13:32:16

它需要进入 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>

It needs to go in a for-each or apply-templates, and you specify the expression to sort on.

From 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>
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文