【问题标题】:How to use XSLT to generate one ouput xml file by reading & processing from multiple input xml如何使用 XSLT 通过读取和处理多个输入 xml 来生成一个输出 xml 文件
【发布时间】:2016-08-23 19:48:44
【问题描述】:

朋友们,

我是 XSLT 的新手。请帮助获得以下逻辑。我用的是unix机器

从以下 3 个输入 xml 文件中,需要使用 xslt 添加 'count' 字段值,并且需要在 count 字段中生成带有添加值的输出

Input XML 1

<topic>
<topicName>Billing</topicName>
<property>
<make>HONDA</make>
<Model>ACCORD</Model>
</property>
<count>10</count>
</topic>
<topic>
<topicName>Billing</topicName>
<property>
<make>TOYOTO</make>
<Model>CAMRY</Model>
</property>
<count>20</count>
</topic>
<topic>
<topicName>Billing</topicName>
<property>
<make>NISSAN</make>
<Model>ALTIMA</Model>
</property>
<count>30</count>
</topic>

输入 XML 2

<topic>
<topicName>Billing</topicName>
<property>
<make>HONDA</make>
<Model>ACCORD</Model>
</property>
<count>100</count>
</topic>
<topic>
<topicName>Billing</topicName>
<property>
<make>TOYOTO</make>
<Model>CAMRY</Model>
</property>
<count>200</count>
</topic>
<topic>
<topicName>Billing</topicName>
<property>
<make>NISSAN</make>
<Model>ALTIMA</Model>
</property>
<count>300</count>
</topic>

输入 XML 3

<topic>
<topicName>Billing</topicName>
<property>
<make>HONDA</make>
<Model>ACCORD</Model>
</property>
<count>1000</count>
</topic>
<topic>
<topicName>Billing</topicName>
<property>
<make>TOYOTO</make>
<Model>CAMRY</Model>
</property>
<count>2000</count>
</topic>
<topic>
<topicName>Billing</topicName>
<property>
<make>NISSAN</make>
<Model>ALTIMA</Model>
</property>
<count>3000</count>
</topic>

从上面的3个输入xml文件中,需要使用xslt添加计数值,并且需要为计数字段生成带有添加值的输出

输出 XML:

<topic>
<topicName>Billing</topicName>
<property>
<make>HONDA</make>
<Model>ACCORD</Model>
</property>
<count>1110</count>
</topic>
<topic>
<topicName>Billing</topicName>
<property>
<make>TOYOTO</make>
<Model>CAMRY</Model>
</property>
<count>2220</count>
</topic>
<topic>
<topicName>Billing</topicName>
<property>
<make>NISSAN</make>
<Model>ALTIMA</Model>
</property>
<count>3330</count>
</topic>

提前致谢

【问题讨论】:

  • 你如何在make和Model分组的不同文件中识别topics?

标签: xslt xslt-1.0 xslt-2.0 xsl-fo xslt-grouping


【解决方案1】:

您可以使用集合读取文件(示例中使用的语法是 Saxon 9 特定的):

<?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"
    exclude-result-prefixes="xs"
    version="2.0">

    <xsl:output indent="yes"/>

    <xsl:param name="file-pattern" select="'topic*.xml'"/>

    <xsl:template name="main">
        <xsl:for-each-group select="collection(concat('.?select=', $file-pattern))//topic" group-by="concat(property/make, '|', property/Model)">
            <xsl:copy>
                <xsl:copy-of select="topicName, property"/>
                <count>
                    <xsl:value-of select="sum(current-group()/count)"/>
                </count>
            </xsl:copy>
        </xsl:for-each-group>
    </xsl:template>

</xsl:stylesheet>

使用 -it:main 运行 Saxon 9,以使用名为 main 的模板开始。

【讨论】:

  • 感谢您的意见。执行 xslt 时,出现此错误 .... "javax.xml.transform.TransformerException: java.lang.RuntimeException: Unsupported XSL element 'w3.org/1999/XSL/Transform:for-each-group'"
  • 您需要下载并使用 Saxon 9 才能使用 XSLT 2.0。
  • Saxon 9 提供开源版本,来自 saxon.sourceforge.net/#F9.7HE。
  • 感谢您的信息。由于我担心管理政策,目前我无法在开发 unix 机器上安装新工具。所以请指导我如何以其他方式实现这一点(从多个输入中读取数据)。
  • 好吧,这个问题被标记为 XSLT 2.0,所以您应该可以访问 XSLT 2.0。至于在 XSLT 1.0 中读取多个文件,请参阅文档函数w3.org/TR/xslt#document 提示的另一个答案。在 XSLT 1.0 中对多个文件进行分组更加困难,因为使用键的通常 Muenchian 分组方法特定于对来自一个文档的节点进行分组。因此,您可能需要首先创建一个结果树片段,它合并来自不同文档的节点,然后将转换为具有exsl:node-set 的节点集的结果树片段分组。
【解决方案2】:

阅读 document() 函数和(对于 1.1)doc() 函数。

在 1.1 中,阅读 xsl:for-each-group 和 deep-equal()。

在 1.0 和 1.1 中,请阅读 sum()。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-07
    • 2013-08-13
    • 1970-01-01
    • 2016-04-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多