1

我需要拆分如下所示的 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>

我在这里错过了什么吗?提前致谢!

4

1 回答 1

1

问题是由于摄取的文档被加载到名为“ Fab”的临时数据库中。转换在XSLT那里应用。成功时将结果移动到目标数据库。文档的这种移动依赖于信息工作室的特定属性,这些属性会自动分配给主XSLT输出的结果,而不是来自xsl:result-document调用的任何辅助输出。

可以将XSLT步骤替换为将XQuery这些属性显式复制到所有结果的步骤,但这取决于特定版本的信息工作室。复制收集器并对其进行自定义以进行拆分更安全。

Github 上有一些非常好的例子:https ://github.com/marklogic/infostudio-plugins

于 2012-05-31T14:36:56.250 回答