【问题标题】:Split XML file with XSLT 2.0 based on element count基于元素计数使用 XSLT 2.0 拆分 XML 文件
【发布时间】:2016-01-08 21:18:35
【问题描述】:

具有以下结构的巨大 XML:

<?xml version="1.0" encoding="UTF-8"?>
<productall>

<product type="electronics" date="1-1-2016">

<type name"Androidbased">

      <product> InStock </product>

</type>      

</product>

<product type="cloths" date="1-12-2008">

<type name"Jeans">

      <product> InStock </product>

</type>      

</product>

<product type="bags" date="1-12-2008">

<type name"FF">

      <product> InStock </product>

</type>      

</product>


</productall>

每种产品类型都有数千条记录,例如电子产品有 2000 条记录,布料有 8000 条记录。

我想将此 XML 文件拆分为多个 XML,每个 XML 包含 1000 条记录,无论其类型如何!

我已经使用基于 java 和 saxon 9 的 XSLT 2.0 来拆分它,但它不起作用,因为它应该是我到目前为止所做的:

java -jar sax.jar productall.xml split.xslt

Split.xslt

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:param name="productall" select="1000"></xsl:param>
    <xsl:template match="/productall/product[@type]">
        <xsl:for-each-group select="product" group-adjacent="(position()-1) idiv $productall">
            <xsl:result-document href="part.{current-grouping-key()}.xml">
                <productall>
                    <xsl:copy-of select="current-group()"></xsl:copy-of>
                </productall>
            </xsl:result-document>
        </xsl:for-each-group>
    </xsl:template>
</xsl:stylesheet>

结果在终端屏幕上打印出来,没有 XML 格式,也没有生成 .XML 文件。不知道命令语法或 XSLT 文件内容有什么问题?

【问题讨论】:

    标签: java xml xslt


    【解决方案1】:

    这里的主要问题是您的模板匹配product 元素,这意味着当您执行xsl:for-each-group 时,您将定位在product 元素上。然后选择product 元素,这些不是当前元素的子元素,而是type 元素的子元素。所以,你需要这样做......

    <xsl:for-each-group select="type/product" group-adjacent="(position()-1) idiv $productall">
    

    但是,您说您想要多个 XML,每个 XML 包含 1000 条记录,无论其类型如何,但当前的 XSLT 分别为每个主要产品执行此操作,这意味着您将获得重复的文件名。

    也许您应该在文件名中包含主要产品类型?

    <result-document href="part.{../../@type}.{current-grouping-key()}.xml">
    

    或者,如果您确实想这样做而不管主要产品类型,您应该更改您的主要模板以匹配productall

    试试这个 XSLT

    <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
        <xsl:param name="productall" select="1000"></xsl:param>
        <xsl:template match="/productall">
             <xsl:for-each-group select="product/type/product" group-adjacent="(position()-1) idiv $productall">
                <xsl:result-document href="part.{current-grouping-key()}.xml">
                    <productall>
                        <xsl:copy-of select="current-group()"></xsl:copy-of>
                    </productall>
                </xsl:result-document>
            </xsl:for-each-group>
        </xsl:template>
    </xsl:stylesheet>
    

    【讨论】:

      【解决方案2】:

      我认为您只需将match="/productall/product[@type]" 更改为match="/productall"

      【讨论】:

        猜你喜欢
        • 2021-12-14
        • 2017-05-23
        • 1970-01-01
        • 1970-01-01
        • 2022-10-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多