我有一个像这样的主要XML文档:
<chapter xmlns:xi="http://www.w3.org/2001/XInclude" xml:id="chapter1">
<title>First chapter</title>
<section xml:id="section1">
<imageobject>
<id>aa12</id>
<image fileref="image1.jpg"/>
</imageobject>
<imageobject>
<id>bb13</id>
<image fileref="image2.jpg"/>
</imageobject>
</section>
<section xml:id="section2" xml:base="../other/section1.xml">
<imageobject>
<id>ab14</id>
<image fileref="image1.jpg"/>
</imageobject>
<imageobject>
<id>ab15</id>
<image fileref="image2.jpg"/>
</imageobject>
<section xml:id="section3" xml:base="../some-other/more/section3.xml">
<imageobject>
<id>ac16</id>
<image fileref="image1.jpg"/>
</imageobject>
</section>
</section>
<section xml:id="section4" xml:base="../some-other/section4.xml">
<imageobject>
<id>ac17</id>
<image fileref="image2.jpg"/>
</imageobject>
</section>
</chapter>
和另一个XML文件和值如:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<NewData>
<Rename id="ab14" imageName="aaaa.jpg"/>
<Rename id="ab15" imageName="bbbb.jpg"/>
<Rename id="ac16" imageName="cccc.jpg"/>
<Rename id="ac17" imageName="dddd.jpg"/>
</NewData>
最后我需要一个类似下面的输出,根据id值替换为正确的重命名图像名称。
<chapter xmlns:xi="http://www.w3.org/2001/XInclude" xml:id="chapter1">
<title>First chapter</title>
<section xml:id="section1">
<imageobject>
<image fileref="image1.jpg"/>
</imageobject>
<imageobject>
<image fileref="image2.jpg"/>
</imageobject>
</section>
<section xml:id="section2" xml:base="../other/section1.xml">
<imageobject>
<image fileref="aaaa.jpg"/>
</imageobject>
<imageobject>
<image fileref="bbbb.jpg"/>
</imageobject>
<section xml:id="section3" xml:base="../some-other/more/section3.xml">
<imageobject>
<image fileref="cccc.jpg"/>
</imageobject>
</section>
</section>
<section xml:id="section4" xml:base="../some-other/section4.xml">
<imageobject>
<image fileref="dddd.jpg"/>
</imageobject>
</section>
</chapter>
这里发生的是:如果第一个XML文档中的id
属性与第二个XML中的id
属性匹配,则第一个文档中的fileref
值将替换为来自第二个XML文件的匹配imageName
。
请参阅我在这里给出的例子。
如何使用XSLT 1.0执行此操作?
我正在使用Saxon或Xsltproc处理器。
提前致谢.. !!
答案 0 :(得分:3)
这是一个XSLT 1.0样式表(使用exsl:node-set,xsltproc和Saxon 6都支持):
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:exsl="http://exslt.org/common"
exclude-result-prefixes="exsl">
<xsl:param name="doc2-url" select="'test2012080602.xml'"/>
<xsl:variable name="doc2" select="document($doc2-url)"/>
<xsl:strip-space elements="*"/>
<xsl:output indent="yes"/>
<xsl:key name="img-by-id" match="Rename" use="@id"/>
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="imageobject">
<xsl:copy>
<xsl:variable name="id" select="id"/>
<xsl:variable name="ref">
<xsl:for-each select="$doc2">
<xsl:if test="key('img-by-id', $id)">
<image filref="{key('img-by-id', $id)/@imageName}"/>
</xsl:if>
</xsl:for-each>
</xsl:variable>
<xsl:variable name="new" select="exsl:node-set($ref)/image"/>
<xsl:choose>
<xsl:when test="$new">
<xsl:copy-of select="$new"/>
</xsl:when>
<xsl:otherwise>
<xsl:copy-of select="image"/>
</xsl:otherwise>
</xsl:choose>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
您可以使用新名称将参数doc2-url
设置为辅助输入文档的位置。