Как указать sortBy с помощью вызова javax.xml.transform.Transformer.transform ()? - PullRequest
0 голосов
/ 01 сентября 2010

Я использую javax.xml.transform.Transformer.transform () для преобразования одного xml в другой через таблицу стилей xsl. Я хотел бы программно установить сортировку первого уровня детей, но не уверен, как это сделать. Я проверил документы , но я не понимаю, какой тип свойства / параметра использовать и как указать в сортировке:

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

Я открыт для других идей, но предпочел бы не анализировать результат xml в документ w3c.

Edit: Для пояснения я ищу установить ключ сортировки и направление для элементов в теге xsl:for-each через Transformer API.

Ответы [ 2 ]

1 голос
/ 01 сентября 2010

Эта таблица стилей:

<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");
0 голосов
/ 01 сентября 2010

Это должно быть в 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>
...