我想使用xslt将两个xml文件合并为一个。
file1:
<cut> <content1> .... </content1> </cut>
file1:
<cut> <content2> .... </content2> </cut>
merged:
<cut>
<content1> ... </content1>
<content2> ... </content2>
</cut>
我想将参数传递给包含要合并的文件的xslt。
xsltproc.exe“--stringparam file1 s:\ file1.xml --stringparam file2 s:\ file2.xml s:\ merge.xslt
merge.xslt:
<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:output indent="yes" omit-xml-declaration="yes"/>
<xsl:strip-space elements="*"/>
<xsl:param name="file1"/>
<xsl:param name="file2"/>
<xsl:variable name="big-doc-rtf">
<xsl:copy-of select="document($file1)"/>
<xsl:copy-of select="document($file2)"/>
</xsl:variable>
<xsl:variable name="big-doc" select="exsl:node-set($big-doc-rtf)"/>
<xsl:template match="/">
<cut>
<xsl:apply-templates select="$big-doc/cut/*"/>
</cut>
</xsl:template>
<xsl:template match="*">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="@*|text()|comment()|processing-instruction()">
<xsl:copy-of select="."/>
</xsl:template>
</xsl:stylesheet>
我只得到一个空的“剪切”标签。怎么了?
答案 0 :(得分:4)
不使用xsltproc而是 xmllint :
(编辑:xsltproc也允许xinclude)
- xinclude:对文档输入执行XInclude处理
x1.xml
<cut><content1>content1</content1></cut>
x2.xml
<cut><content2>content2</content2></cut>
x3.xml
<?xml version="1.0"?>
<cut xmlns:xi="http://www.w3.org/2003/XInclude">
<xi:include href="x1.xml" parse="xml" xpointer="xpointer(/cut/content1)"/>
<xi:include href="x2.xml" parse="xml" xpointer="xpointer(/cut/content2)"/>
</cut>
运行:
$ xmllint -xinclude x3.xml
<?xml version="1.0"?>
<cut xmlns:xi="http://www.w3.org/2003/XInclude">
<content1>content1</content1>
<content2>content2</content2>
</cut>
答案 1 :(得分:1)
无法重现问题。
您的代码中很可能两个document()
函数都返回“nothing” - 这意味着用作每个调用的第一个参数的URI不识别文件(无法找到/解析该文件) ,或文件不包含格式良好的XML文档。
答案 2 :(得分:0)
对于xalan和saxon解析器,在document()调用中使用硬编码路径,这对我来说很好。问题可能是由于某种原因,您的xsl没有看到您的文档。
我怀疑源文档中的xml存在问题,因为这可能会引发错误。