我有下面的XML文件,我想以特定的方式对它进行排序。基本上,XMLtag将首先按字母排序,然后在每个XMLtag中,使用一个XMLelement也按字母排序。请看当前的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>
一旦标记被排序,那么对于这些标记中的每一个,我将使用特定的元素对它们进行排序。示例:将使用application xmlelement值按字母顺序对ApplicaitOnVisiales标记进行排序。对于classAccesses,apexClass将用于按字母顺序排序,最后对于fieldPermissions,将使用field element进行排序。我在玩当前的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);
在具有高阶函数支持的XSLT 3(Saxon 10或更高版本的所有版本,Saxon 9.8和9.9 PE和EE,Saxon-JS2)中,您可以使用节点名分组,然后根据从名称到选择子元素的函数的映射对组进行排序:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xpath-default-namespace="http://soap.sforce.com/2006/04/metadata"
exclude-result-prefixes="#all"
version="3.0">
<xsl:param name="sort-keys"
as="map(xs:QName, function(*))"
select="map {
QName('http://soap.sforce.com/2006/04/metadata', 'applicationVisibilities') : function($el) { $el/application },
QName('http://soap.sforce.com/2006/04/metadata', 'classAccesses') : function($el) { $el/apexClass },
QName('http://soap.sforce.com/2006/04/metadata', 'fieldPermissions') : function($el) { $el/field }
}"/>
<xsl:mode on-no-match="shallow-copy"/>
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/*">
<xsl:copy>
<xsl:for-each-group select="*" group-by="node-name()">
<xsl:sort select="string(current-grouping-key())"/>
<xsl:apply-templates select="current-group()">
<xsl:sort select="$sort-keys(node-name())(.)"/>
</xsl:apply-templates>
</xsl:for-each-group>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
在早期版本中,您可以使用
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xpath-default-namespace="http://soap.sforce.com/2006/04/metadata"
exclude-result-prefixes="#all"
version="3.0">
<xsl:mode on-no-match="shallow-copy"/>
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/*">
<xsl:copy>
<xsl:for-each-group select="*" group-by="node-name()">
<xsl:sort select="current-grouping-key() => string()"/>
<xsl:apply-templates select="current-group()">
<xsl:sort select="if (. instance of element(applicationVisibilities))
then application
else if (. instance of element(classAccesses))
then apexClass
else if (. instance of element(fieldPermissions))
then field
else ()"/>
</xsl:apply-templates>
</xsl:for-each-group>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
●进入编辑地图页面—>点击打开图层管理窗口—>点样式,选择渲染方式,点“确定”保存设置。 ●排序渲染:显示标注的绘制顺序。
我想使用XSL编码在XML开始时添加样式表标记 输入XML:
使用样式表通常有两种做法,一种是设置全局的样式表,通过调用 QApplication::setStyleSheet()方法来实现;一种是在指定的窗口部件上使用样式表 ,这可以通过调用 QWidget::setStyleSheet()方法来实现。如果你为同一个部件或应用程序指定了 多种不同的样式表(比如有的设置字体颜色,有的设置界面背景),那么 Qt 将会自动将它们 的效果组合起来,这也被称作是样式
问题内容: 我在OSX SnowLeopard(10.6.2)上,可以安装所需的任何东西。我最好选择Python或Java解决方案。我已经在Google上进行搜索,并发现了很多有关编写自己的程序来执行此操作的信息,但这只是一个快速而肮脏的实验,因此我不想在编写大量代码上花费很多时间来执行此操作,我相信其他人已经做到了。 现在这已成为话题,不要以这个问题为例,说明您的推荐请求为何是话题,不是。 我很
我想在基于Saxon的xslt转换中使用排序规则。源文件: 和我的转变: 这在氧气中几乎很好工作,输出为: (“”应该是第二个条目,但我想这是另一个问题) 看起来好像saxon现在想要使用作为文件。它不存在。 问题是:我如何在命令行上使用这个样式表。 如果合适的话,我还想问一下如何在两个“A”之间排序“?”但我可以在另一个问题中问这个。
试图用Saxon HE解析XSLT 2.0样式表,得到以下错误: 此样式表包含一些它试图检索的远程资源: 然而,我已经确认所有的链接都是有效的,并且可以通过浏览器或curl检索。此外,当我在上提供这些文件时,并更改