java < xls:当特殊字符[即点(.)、冒号(:)、分号(;)]存在

goucqfw6  于 2023-09-29  发布在  Java
关注(0)|答案(3)|浏览(83)

xsl:sort在特殊字符如“,:“是礼物。这里有什么问题吗?

我正在尝试使用java dom4j库从xml数据渲染html。虽然真实的的项目有多个排序标准,但我在这里对具体问题进行了总结。

**预期的排序顺序是ASCII顺序。**在线String Sort Toll也给出了我预期的输出。

我有一些xml数据ex:

<employee>
    <name>
        <![CDATA[test 1.8 - test]]>
    </name>
    <name>
        <![CDATA[test 4 - test]]>
    </name>
    <name>
        <![CDATA[Test 2 - test]]>
    </name>
</employee>

我试图排序他们与xsl Transformer与。用于对其进行排序的代码段...

<xsl:for-each select="employee/name">
    <xsl:sort select="name" case-order="upper-first"/>
...

预期输出顺序

Test 2 - test
test 1.8 - test
test 4 - test

我得到的输出顺序

test 1.8 - test
Test 2 - test
test 4 - test

像这样得到订单

; - ;
& - &
T1 - T1

代替

& - &
; - ;
T1 - T1
5sxhfpxr

5sxhfpxr1#

首先,您的代码段对employee s进行排序,而不是name s。
现在,您得到的结果对名称排序后的预期输出。如果你想让Test 2 - test的条目出现在第一位,因为它以大写的T开头,那么你需要这样做:

<xsl:for-each select="name">
        <xsl:sort collation="http://www.w3.org/2005/xpath-functions/collation/codepoint"/>
        ....
    </xsl:for-each>

而且你需要一个处理器,它支持XNUMX 2.0或更高版本。
我看不出这个点或其他字符的存在和这有什么关系。

ivqmmu1c

ivqmmu1c2#

期望的排序顺序为ASCII顺序。

如果我们接受“按ASCII顺序排序”的定义,即按字符在ASCII表中出现的顺序进行排序(即按字符在ASCII表中出现的顺序进行排序)。它们的Unicode代码点值),同时只考虑可打印字符(即,字符的范围从&#32;&#126;),那么我们可以按照下面的例子进行排序:

XML格式

<input>
   <char ascii="32"> </char>
   <char ascii="45">-</char>
   <char ascii="95">_</char>
   <char ascii="44">,</char>
   <char ascii="59">;</char>
   <char ascii="58">:</char>
   <char ascii="33">!</char>
   <char ascii="63">?</char>
   <char ascii="47">/</char>
   <char ascii="46">.</char>
   <char ascii="96">`</char>
   <char ascii="94">^</char>
   <char ascii="126">~</char>
   <char ascii="39">'</char>
   <char ascii="34">"</char>
   <char ascii="40">(</char>
   <char ascii="41">)</char>
   <char ascii="91">[</char>
   <char ascii="93">]</char>
   <char ascii="123">{</char>
   <char ascii="125">}</char>
   <char ascii="64">@</char>
   <char ascii="36">$</char>
   <char ascii="42">*</char>
   <char ascii="92">\</char>
   <char ascii="38">&amp;</char>
   <char ascii="35">#</char>
   <char ascii="37">%</char>
   <char ascii="43">+</char>
   <char ascii="60">&lt;</char>
   <char ascii="61">=</char>
   <char ascii="62">&gt;</char>
   <char ascii="124">|</char>
   <char ascii="48">0</char>
   <char ascii="49">1</char>
   <char ascii="50">2</char>
   <char ascii="51">3</char>
   <char ascii="52">4</char>
   <char ascii="53">5</char>
   <char ascii="54">6</char>
   <char ascii="55">7</char>
   <char ascii="56">8</char>
   <char ascii="57">9</char>
   <char ascii="97">a</char>
   <char ascii="65">A</char>
   <char ascii="98">b</char>
   <char ascii="66">B</char>
   <char ascii="99">c</char>
   <char ascii="67">C</char>
   <char ascii="100">d</char>
   <char ascii="68">D</char>
   <char ascii="101">e</char>
   <char ascii="69">E</char>
   <char ascii="102">f</char>
   <char ascii="70">F</char>
   <char ascii="103">g</char>
   <char ascii="71">G</char>
   <char ascii="104">h</char>
   <char ascii="72">H</char>
   <char ascii="105">i</char>
   <char ascii="73">I</char>
   <char ascii="106">j</char>
   <char ascii="74">J</char>
   <char ascii="107">k</char>
   <char ascii="75">K</char>
   <char ascii="108">l</char>
   <char ascii="76">L</char>
   <char ascii="109">m</char>
   <char ascii="77">M</char>
   <char ascii="110">n</char>
   <char ascii="78">N</char>
   <char ascii="111">o</char>
   <char ascii="79">O</char>
   <char ascii="112">p</char>
   <char ascii="80">P</char>
   <char ascii="113">q</char>
   <char ascii="81">Q</char>
   <char ascii="114">r</char>
   <char ascii="82">R</char>
   <char ascii="115">s</char>
   <char ascii="83">S</char>
   <char ascii="116">t</char>
   <char ascii="84">T</char>
   <char ascii="117">u</char>
   <char ascii="85">U</char>
   <char ascii="118">v</char>
   <char ascii="86">V</char>
   <char ascii="119">w</char>
   <char ascii="87">W</char>
   <char ascii="120">x</char>
   <char ascii="88">X</char>
   <char ascii="121">y</char>
   <char ascii="89">Y</char>
   <char ascii="122">z</char>
   <char ascii="90">Z</char>
</input>

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

<xsl:param name="ascii">!"#$%&amp;'()*+,-./0123456789:;&lt;=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~</xsl:param>
<xsl:param name="en">-_,;:!?/.`^~'"()[]{}@$*\&amp;#%+&lt;=>|0123456789aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ</xsl:param>

<xsl:template match="/root">
    <xsl:copy>
        <xsl:for-each select="char">
            <xsl:sort select="translate(., $ascii, $en)" lang="en"/>
            <xsl:copy-of select="."/>
        </xsl:for-each> 
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>

**结果 *

<?xml version="1.0" encoding="UTF-8"?><root>
<char ascii="32"> </char>
<char ascii="33">!</char>
<char ascii="34">"</char>
<char ascii="35">#</char>
<char ascii="36">$</char>
<char ascii="37">%</char>
<char ascii="38">&amp;</char>
<char ascii="39">'</char>
<char ascii="40">(</char>
<char ascii="41">)</char>
<char ascii="42">*</char>
<char ascii="43">+</char>
<char ascii="44">,</char>
<char ascii="45">-</char>
<char ascii="46">.</char>
<char ascii="47">/</char>
<char ascii="48">0</char>
<char ascii="49">1</char>
<char ascii="50">2</char>
<char ascii="51">3</char>
<char ascii="52">4</char>
<char ascii="53">5</char>
<char ascii="54">6</char>
<char ascii="55">7</char>
<char ascii="56">8</char>
<char ascii="57">9</char>
<char ascii="58">:</char>
<char ascii="59">;</char>
<char ascii="60">&lt;</char>
<char ascii="61">=</char>
<char ascii="62">&gt;</char>
<char ascii="63">?</char>
<char ascii="64">@</char>
<char ascii="65">A</char>
<char ascii="66">B</char>
<char ascii="67">C</char>
<char ascii="68">D</char>
<char ascii="69">E</char>
<char ascii="70">F</char>
<char ascii="71">G</char>
<char ascii="72">H</char>
<char ascii="73">I</char>
<char ascii="74">J</char>
<char ascii="75">K</char>
<char ascii="76">L</char>
<char ascii="77">M</char>
<char ascii="78">N</char>
<char ascii="79">O</char>
<char ascii="80">P</char>
<char ascii="81">Q</char>
<char ascii="82">R</char>
<char ascii="83">S</char>
<char ascii="84">T</char>
<char ascii="85">U</char>
<char ascii="86">V</char>
<char ascii="87">W</char>
<char ascii="88">X</char>
<char ascii="89">Y</char>
<char ascii="90">Z</char>
<char ascii="91">[</char>
<char ascii="92">\</char>
<char ascii="93">]</char>
<char ascii="94">^</char>
<char ascii="95">_</char>
<char ascii="96">`</char>
<char ascii="97">a</char>
<char ascii="98">b</char>
<char ascii="99">c</char>
<char ascii="100">d</char>
<char ascii="101">e</char>
<char ascii="102">f</char>
<char ascii="103">g</char>
<char ascii="104">h</char>
<char ascii="105">i</char>
<char ascii="106">j</char>
<char ascii="107">k</char>
<char ascii="108">l</char>
<char ascii="109">m</char>
<char ascii="110">n</char>
<char ascii="111">o</char>
<char ascii="112">p</char>
<char ascii="113">q</char>
<char ascii="114">r</char>
<char ascii="115">s</char>
<char ascii="116">t</char>
<char ascii="117">u</char>
<char ascii="118">v</char>
<char ascii="119">w</char>
<char ascii="120">x</char>
<char ascii="121">y</char>
<char ascii="122">z</char>
<char ascii="123">{</char>
<char ascii="124">|</char>
<char ascii="125">}</char>
<char ascii="126">~</char>
</root>

(*)重要提示:

上面的结果是使用Xalan 2.7.2处理器和lang="en"生成的。如果使用不同的处理器和/或不同的lang值,则很容易得到不同的结果。在这种情况下,您需要调整$en参数以反映环境的实际排序顺序。
当然,正如我的另一个答案所示,如果您使用的处理器支持XSLT2.0+,那么所有这些都是不必要的。

rseugnpd

rseugnpd3#

这可能根本不符合您的要求,但请注意DOM4J对元素内容使用“实时”列表,直接在代码中对节点进行排序变得非常优雅:

doc.getRootElement().content().sort(Comparator.comparing(Node::getText));

当然,它会弄乱任何现有的格式,但这可能是固定的一个漂亮的打印选项。

相关问题