我有几个xml文件,其名称存储在另一个xml文件中。
我想使用xsl来生成xml文件组合的摘要。我记得有一种方法可以使用msxml扩展(我使用的是msxml)。
我知道我可以使用select="document(filename)"
获取每个文件的内容,但我不确定如何将所有这些文档合并为一个。
2008年10月21日我应该提到我想对组合的xml进行进一步的处理,因此仅仅从变换中输出它是不够的,我需要将它存储为变量中的节点集。
答案 0 :(得分:3)
以下是您可以做的事情的一个小例子:
file1.xml:
<foo>
<bar>Text from file1</bar>
</foo>
file2.xml:
<foo>
<bar>Text from file2</bar>
</foo>
INDEX.XML:
<index>
<filename>file1.xml</filename>
<filename>file2.xml</filename>
summarize.xsl:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:exsl="http://exslt.org/common"
extension-element-prefixes="exsl">
<xsl:variable name="big-doc-rtf">
<xsl:for-each select="/index/filename">
<xsl:copy-of select="document(.)"/>
</xsl:for-each>
</xsl:variable>
<xsl:variable name="big-doc" select="exsl:node-set($big-doc-rtf)"/>
<xsl:template match="/">
<xsl:element name="summary">
<xsl:apply-templates select="$big-doc/foo"/>
</xsl:element>
</xsl:template>
<xsl:template match="foo">
<xsl:element name="text">
<xsl:value-of select="bar"/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
将样式表应用于 index.xml 可以为您提供:
<?xml version="1.0" encoding="UTF-8"?><summary><text>Text from file1</text><text>Text from file2</text></summary>
技巧是使用文档函数(几乎所有XSLT 1.0处理器都支持的扩展函数)加载不同的文档,将内容作为变量体的一部分输出,然后将变量转换为节点集以进一步处理
答案 1 :(得分:2)
假设您在文件中列出了这样的文件名:
<files>
<file>a.xml</file>
<file>b.xml</file>
</files>
然后你可以在上面的文件中使用这样的样式表:
<xsl:stylesheet version="1.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="/">
<root>
<xsl:apply-templates select="files/file"/>
</root>
</xsl:template>
<xsl:template match="file">
<xsl:copy-of select="document(.)"/>
</xsl:template>
</xsl:stylesheet>
答案 2 :(得分:0)
查看document()
function documentation。
您可以使用document()
在转换过程中加载更多XML文档。它们作为节点集加载。这意味着您最初会提供包含要加载到XSLT的文件名的XML,并从那里获取它:
<xsl:copy-of select="document(@href)/"/>
答案 3 :(得分:0)
感谢所有答案。以下是我正在使用msxml的解决方案的内容。
<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ms="urn:schemas-microsoft-com:xslt">
<xsl:output method="xml"/>
<xsl:template match="/">
<xsl:variable name="combined">
<xsl:apply-templates select="files"/>
</xsl:variable>
<xsl:copy-of select="ms:node-set($combined)"/>
</xsl:template>
<xsl:template match="files">
<multifile>
<xsl:apply-templates select="file"/>
</multifile>
</xsl:template>
<xsl:template match="file">
<xsl:copy-of select="document(@name)"/>
</xsl:template>
</xsl:stylesheet>
现在我正在尝试提高性能,因为每个文件大约为8 MB并且转换需要很长时间,但这是另一个问题。