BaseX XSLT 在返回第一个结果后失败
BaseX XSLT fails after returning first result
我有一个大型 XML 文件存储在 BaseX 中,我需要将其拆分为更小的模块化文档。为此,我创建了一个 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() 函数时,它仅 returns(创建)第一个文档。这是我为此使用的 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 returns 错误 [FODC0002]“”(第 1 行):文件过早结束。当我在 BaseX 文档中查找错误代码时,此错误定义为 "The specified document resource cannot be retrieved. "。在循环中使用 xslt:transform 函数是否有一些限制?我不明白为什么它第一次能够检索到,但之后就不行了。我曾尝试将 XSL 移动到不同的文件位置,但没有成功。我是不是漏掉了一些非常明显的东西?
我认为 BaseX 邮件列表上的 Gerrit Imsieke 有正确的解释,BaseX 不会无法处理 XSLT 的第二个输入,它无法将您第一次调用 xslt:transform
的空结果转换为它的任何 XQuery 表示。因此,改用 xslt:transform-text
应该可以解决您的问题。或者让 XSLT 输出带有根元素的主要结果。
我有一个大型 XML 文件存储在 BaseX 中,我需要将其拆分为更小的模块化文档。为此,我创建了一个 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() 函数时,它仅 returns(创建)第一个文档。这是我为此使用的 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 returns 错误 [FODC0002]“”(第 1 行):文件过早结束。当我在 BaseX 文档中查找错误代码时,此错误定义为 "The specified document resource cannot be retrieved. "。在循环中使用 xslt:transform 函数是否有一些限制?我不明白为什么它第一次能够检索到,但之后就不行了。我曾尝试将 XSL 移动到不同的文件位置,但没有成功。我是不是漏掉了一些非常明显的东西?
我认为 BaseX 邮件列表上的 Gerrit Imsieke 有正确的解释,BaseX 不会无法处理 XSLT 的第二个输入,它无法将您第一次调用 xslt:transform
的空结果转换为它的任何 XQuery 表示。因此,改用 xslt:transform-text
应该可以解决您的问题。或者让 XSLT 输出带有根元素的主要结果。