我需要拆分XML文件,如下所示
<root>
<Credit>
<TradeId>123</TradeId>
<name>abcd</name>
</Credit>
<Credit>
<TradeId>456</TradeId>
<name>efgh</name>
</Credit>
<Credit>
<TradeId>789</TradeId>
<name>ijkl</name>
</Credit>
</root>
由节点Credit分成3个单独的文件,每个文件如下所示:
<root>
<Credit>
<TradeId>123</TradeId>
<name>abcd</name>
</Credit>
</root>
我在MarkLogic的Information Studio中的XSLT(样式表版本2.0)转换选项中使用了以下代码,但它无效。它正在加载原始文件,而不是将其拆分为较小的文件并加载它们。
<xsl:template match="/">
<xsl:for-each select="collection(iri-to-uri('./?select=*.xml;recurse=yes'))">
<xsl:for-each select="//Credit">
<xsl:variable name="TradeId" select="TradeId" />
<xsl:variable name="filename" select="concat('./_Out/', $TradeId, .xml')" />
<xsl:value-of select="$filename" />
<xsl:result-document href="{$filename}">
<root>
<xsl:copy-of select="node()"/>
</root>
</xsl:result-document>
</xsl:for-each>
</xsl:for-each>
</xsl:template>
我在这里遗漏了什么吗?提前谢谢!
答案 0 :(得分:1)
问题是由于摄取的文档被加载到名为“Fab
”的临时数据库中。那里应用XSLT
转换。成功后,结果将移至目标数据库。此文档的移动依赖于特定于信息工作室的属性,这些属性会自动分配给主XSLT
输出的结果,但不会分配给来自xsl:result-document
次调用的任何辅助输出。
可以用XSLT
步骤替换XQuery
步骤,将这些属性明确复制到所有结果,但这使得它依赖于信息工作室的特定版本。复制收集器并自定义它以进行拆分更安全。
Github上有一些很好的例子:https://github.com/marklogic/infostudio-plugins