【发布时间】:2021-06-10 13:50:52
【问题描述】:
我有下面的 XML 文件,我想以特定方式对其进行排序。基本上,XMLTags 将首先按字母顺序排序,然后在每个 XMLtag 中,其中一个 XML 元素也将用于按字母顺序对它们进行排序。请查看当前的 XML 和我需要的最终结果
原始 XML
<?xml version="1.0" encoding="UTF-8"?><Profile xmlns="http://soap.sforce.com/2006/04/metadata">
<applicationVisibilities>
<application>Test</application>
<default>true</default>
<visible>true</visible>
</applicationVisibilities>
<classAccesses>
<apexClass>TestClass</apexClass>
<enabled>false</enabled>
</classAccesses>
<applicationVisibilities>
<application>Class</application>
<default>true</default>
<visible>false</visible>
</applicationVisibilities>
<classAccesses>
<apexClass>FooClass</apexClass>
<enabled>false</enabled>
</classAccesses>
<fieldPermissions>
<editable>false</editable>
<field>Hello</field>
<readable>true</readable>
</fieldPermissions>
<applicationVisibilities>
<application>Foo</application>
<default>true</default>
<visible>false</visible>
</applicationVisibilities>
<fieldPermissions>
<editable>false</editable>
<field>Blah</field>
<readable>true</readable>
</fieldPermissions>
</Profile>
最终输出
<?xml version="1.0" encoding="UTF-8"?><Profile xmlns="http://soap.sforce.com/2006/04/metadata">
<applicationVisibilities>
<application>Class</application>
<default>true</default>
<visible>false</visible>
</applicationVisibilities>
<applicationVisibilities>
<application>Foo</application>
<default>true</default>
<visible>false</visible>
</applicationVisibilities>
<applicationVisibilities>
<application>Test</application>
<default>true</default>
<visible>true</visible>
</applicationVisibilities>
<classAccesses>
<apexClass>FooClass</apexClass>
<enabled>false</enabled>
</classAccesses>
<classAccesses>
<apexClass>TestClass</apexClass>
<enabled>false</enabled>
</classAccesses>
<fieldPermissions>
<editable>false</editable>
<field>Blah</field>
<readable>true</readable>
</fieldPermissions>
<fieldPermissions>
<editable>false</editable>
<field>Hello</field>
<readable>true</readable>
</fieldPermissions>
</Profile>
标签排序后,对于每个标签,我将使用特定元素对它们进行排序。示例:applicaitonVisibilities 标记将使用应用程序 xmlelement 值按字母顺序排序。对于 classAccesses,apexClass 将用于按字母顺序排序,最后对于 fieldPermissions,将使用字段元素进行排序。我正在使用当前的 XSL 样式表,但它不起作用。
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:strip-space elements="*" />
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*" />
</xsl:copy>
</xsl:template>
<xsl:template match="Profile/applicationVisibilities">
<xsl:copy>
<xsl:apply-templates select="application">
<xsl:sort select="node()" data-type="text" order="ascending" />
</xsl:apply-templates>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
我当前使用当前 XSL 的 java 代码
XSL TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer(new StreamSource(new File("profile.xsl")));
//transformerFactory.setAttribute("indent-number", 10);
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4");
transformer.setOutputProperty(OutputKeys.METHOD, "xml");
transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "no");
transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
DOMSource source = new DOMSource(document);
StreamResult result = new StreamResult(new File(originalFile));
transformer.transform(source, result);
【问题讨论】:
-
JAXP 是一个 JRE/JDK API,它一方面具有内置处理器仅支持 XSLT 1,但另一方面在 Java 世界中可以轻松地与 Saxon 10 或 9 一起使用以具有XSLT 2 或 3 支持。你能把例如Saxon 10 HE 在课堂路径上?
-
是的,我可以将 saxon 放在类路径中。请提供版本#。
-
Saxon HE 10.3 是当前版本。
-
Saxon 10 HE 在 Sourceforge sourceforge.net/projects/saxon/files/Saxon-HE/10/Java 或 Maven 上可用。