【问题标题】:Split XML into multiple files using xslt on string length在字符串长度上使用 xslt 将 XML 拆分为多个文件
【发布时间】:2015-08-31 04:18:46
【问题描述】:

我正在考虑尝试将 XML 文件拆分为 2 个单独的文件。它们必须根据特定元素中字符串的长度进行拆分。

我一直在尝试使用 <xsl:for-each-group><xsl:result-document> 元素来执行此操作,但只能在结果文件中获得第一个匹配的“对象”。

例如:

<?xml version="1.0" encoding="UTF-8"?>
<books>
    <book>
        <bookId>4125151</bookId>
        <author>John Davies</author>
    </book>
    <book>
        <bookId>1000257896</bookId>
    <author>Lee Frost</author>
    </book>
    <book>
        <bookId>1234569870</bookId>
        <author>Joe Walters</author>
    </book>
    <book>
        <bookId>2145789</bookId>
        <author>Sarah Wyer</author>
    </book>
    <book>
        <bookId>4085151</bookId>
        <author>Jane Cohen</author>
    </book>
</books>

XSL:

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="books">
 <xsl:for-each-group select="book[string-length(bookId)!=10]" group-by="string-length(book/bookId)">

    <xsl:result-document href="file:/C:/devFiles/legacy.xml">
        <xsl:copy-of select="." />
    </xsl:result-document>

    </xsl:for-each-group>
 </xsl:template>

</xsl:stylesheet>

结果应该是 John Davies、Joe Walters、Sarah Wyer 和 Jane Cohen 的书都保存在 legacy.xml

我在正确的轨道上吗?有没有更好的办法?

提前致谢!

【问题讨论】:

  • 为什么 Lee Frost 的书与 Joe Walters 的书不在同一组?两者都有 10 个字符的 bookId。 -- 另外,您说的是多个文件:其他文件的名称是什么,其中包含什么?
  • 对不起,你是对的。 Joe Walters 应该和 Lee Frost 在另一个文件中 - 在另一个文件中。至于“多个”文件,在这种情况下,我只需要 2 个文件。 legacy.xml(bookIds 长度不是 10)和 current.xml(bookIds 长度为 10)。

标签: xml xslt xslt-2.0


【解决方案1】:

我只需要 2 个文件。 legacy.xml(bookIds 长度不是 10)& current.xml(长度为 10 的 bookIds)。

那我建议你这样做:

XSLT 2.0

<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

<xsl:template match="/books">
    <books>
        <xsl:copy-of select="book[string-length(bookId)=10]" />
    </books>
    <xsl:result-document href="file:/C:/devFiles/legacy.xml">
        <books>
            <xsl:copy-of select="book[string-length(bookId)!=10]" />
        </books>
  </xsl:result-document>
</xsl:template>

</xsl:stylesheet>

这将返回以下内容:

<?xml version="1.0" encoding="UTF-8"?>
<books>
   <book>
        <bookId>1000257896</bookId>
      <author>Lee Frost</author>
    </book>
   <book>
        <bookId>1234569870</bookId>
        <author>Joe Walters</author>
    </book>
</books>

作为转换的“正常”结果,您可以在启动转换时将其定向到文件,还可以创建 legacy.xml 文件,其中包含:

<?xml version="1.0" encoding="UTF-8"?>
<books>
   <book>
        <bookId>4125151</bookId>
        <author>John Davies</author>
    </book>
   <book>
        <bookId>2145789</bookId>
        <author>Sarah Wyer</author>
    </book>
   <book>
        <bookId>4085151</bookId>
        <author>Jane Cohen</author>
    </book>
</books>

【讨论】:

  • 谢谢,这似乎是最简单的解决方案。前几天potame的解决方案也有效 - 我只是一个白痴,在错误的文件夹中查找结果文件!
猜你喜欢
  • 2012-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多