当前位置: 首页 > 知识库问答 >
问题:

使用XSL样式表排序XMLTag Java变压器厂

段干兴业
2023-03-14

我有下面的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);

共有1个答案

岑元徽
2023-03-14

在具有高阶函数支持的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检索。此外,当我在上提供这些文件时,并更改