使用字符串长度上的 xslt 将 XML 拆分为多个文件
Split XML into multiple files using xslt on string length
我正在尝试将 XML 文件拆分为 2 个单独的文件。它们必须根据特定元素中字符串的长度进行拆分。
我一直在尝试使用 <xsl:for-each-group>
和 <xsl:result-document>
元素来执行此操作,但只在结果文件中获得第一个匹配项 'object'。
例如:
<?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
我走在正确的轨道上吗?有没有更好的方法?
提前致谢!
I only need the 2 files. legacy.xml (bookIds not 10 in length) &
current.xml (bookIds with length of 10).
那我建议你这样做:
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>
这将 return 以下内容:
<?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>
作为转换的 "normal" 结果,您可以在启动转换时将其定向到文件,还可以创建包含以下内容的 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>
我正在尝试将 XML 文件拆分为 2 个单独的文件。它们必须根据特定元素中字符串的长度进行拆分。
我一直在尝试使用 <xsl:for-each-group>
和 <xsl:result-document>
元素来执行此操作,但只在结果文件中获得第一个匹配项 'object'。
例如:
<?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
我走在正确的轨道上吗?有没有更好的方法?
提前致谢!
I only need the 2 files. legacy.xml (bookIds not 10 in length) & current.xml (bookIds with length of 10).
那我建议你这样做:
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>
这将 return 以下内容:
<?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>
作为转换的 "normal" 结果,您可以在启动转换时将其定向到文件,还可以创建包含以下内容的 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>