BaseX XSLT返回第一个结果后失败

问题描述 投票:0回答:1

我在BaseX中存储了一个大XML文件,我需要将其拆分成较小的模块化文档。我已经创建了一个XSL文件来这样做:

<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" encoding="UTF-8"/>
    <xsl:param name="schema"/>
    <xsl:param name="model"/>
    <xsl:param name="sysDiff"/>
    <xsl:param name="sys"/>
    <xsl:param name="subsys"/>
    <xsl:param name="subsubsys"/>
    <xsl:param name="assy"/>
    <xsl:param name="disassy"/>
    <xsl:param name="disassyv"/>
    <xsl:param name="info"/>
    <xsl:param name="infov"/>
    <xsl:param name="itemloc"/>
    <xsl:param name="tname"/>
    <xsl:param name="iname"/>
    <xsl:param name="outputDir"/>

    <xsl:template match="/">
        <xsl:result-document href="{concat($outputDir, '/DMC-',$model,'-',$sysDiff,'-',$sys,'-',$subsys,$subsubsys,'-',$assy,'-',$disassy,$disassyv,'-',$info,$infov,'-',$itemloc,'.xml')}" method="xml">
            <dmodule>
                <identAndStatusSection>
                    <dmAddress>
                        <dmIdent>
                            <dmCode modelIdentCode="{$model}" systemDiffCode="{$sysDiff}">
                                <xsl:attribute name="systemCode" select="$sys"/>
                                <xsl:attribute name="subSystemCode" select="$subsys"/>
                                <xsl:attribute name="subSubSystemCode" select="$subsubsys"/>
                                <xsl:attribute name="assyCode" select="$assy"/>
                                <xsl:attribute name="disassyCode" select="$disassy"/>
                                <xsl:attribute name="disassyCodeVariant" select="$disassyv"/>
                                <xsl:attribute name="infoCode" select="$info"/>
                                <xsl:attribute name="infoCodeVariant" select="$infov"/>
                                <xsl:attribute name="itemLocationCode" select="$itemloc"/>
                            </dmCode>
                            <language languageIsoCode="en" countryIsoCode="US"/>
                            <issueInfo issueNumber="000" inWork="01"/>
                        </dmIdent>
                    </dmAddress>
                </identAndStatusSection>
            </dmodule>
        </xsl:result-document>    
    </xsl:template>
</xsl:stylesheet>

我的问题是,在BaseX中使用xslt:transform()函数时,它仅返回(创建)第一个文档。这是我为此使用的XQuery:

 let $style := doc('file:///C:/base.xsl')

   for $d in doc('file:///C:/Users/tfurst/Documents/Book1-test.xml')//title
      for $newD in //*[title]
      where $newD/title/@id eq $d/@id
        let $schema := $d/schemaName
        let $model := $d/modelic
        let $sdc := $d/sdc
        let $sys := $d/systemCode
        let $subsys := $d/subsys
        let $subsubsys := $d/subsubsys
        let $assy := $d/assy
        let $disassy := $d/disassy
        let $disassyv := $d/disassyv
        let $info := $d/infoCode
        let $infov := $d/infov
        let $itemloc := $d/itemloc
        let $tname := $d/tname
        let $iname := $d/iname
        return xslt:transform($newD,$style, map {"outputDir":"file:///G:/LMA-Conv/Flight/test-conv-out", "model":$model, "sysDiff":$sdc, "sys":$sys, "subsys":$subsys, "subsubsys":$subsubsys, "assy":$assy, "disassy":$disassy, "disassyv":$disassyv, "info":$info, "infov":$infov, "itemloc":$itemloc, "tname":$tname, "iname":$iname})

名为Book1-test.xml的文档实质上是元素的现有ID到新的输出文件名的映射。创建第一个XML输出文件后,BaseX返回ERROR [FODC0002]“”(第1行):文件的结尾过早。当我在BaseX文档中查找错误代码时,此错误定义为“无法检索指定的文档资源。”。在循环中使用xslt:transform函数有一些限制吗?我不明白为什么它能够第一次检索,但是之后却无法检索。我试图将XSL移到不同的文件位置,但是不走运。我是否在这里错过了一个荒谬的显而易见的事情?

xml xslt xquery basex
1个回答
0
投票

[我认为BaseX邮件列表上的Gerrit Imsieke有正确的解释,BaseX不会处理第二个输入到XSLT的内容,它无法将第一次调用xslt:transform的空结果转换为任何XQuery表示形式。因此,改用xslt:transform-text应该可以解决您的问题。或让XSLT输出带有根元素的主要结果。

© www.soinside.com 2019 - 2024. All rights reserved.