通过匹配输入文件和访问文件中的属性值,从document()访问的xml文件中写入值

时间:2014-02-07 00:02:07

标签: xml xslt xpath

我是XSLT的新手,我正在尝试完成以下任务:

输入文件如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<root>
  <para>
    Some text
    <frag id="1"/> 
    Some text 
    <frag id="2"/> 
    Some text
    <frag id="3"/>
  </para>
</root>

<frag id="x"/>元素应该被另一个文件中相应元素的值替换,可以使用样式表中的document()函数进行访问。

通过document()访问的文件如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<root>
     <frag id="1">X</frag>
     <frag id="2">Y</frag>
     <frag id="3">Z</frag>
</root>

结果应如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<root>
  <para>
    Some text
    X 
    Some text 
    Y
    Some text
    Z
  </para>
</root>

我尝试了很多xpath表达式,循环和if语句的组合等等。 下面的XSL是这些变体中的一个,它产生的输出最接近期望的结果。

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs" version="2.0">
  <xsl:template match="frag">   

     <xsl:for-each select="document('frag.xml')/root/frag/@id = frag/@id">

       <xsl:value-of select="document('frag.xml')/root/frag"/>

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

此XSLT在输入文件中的每个<frag id="x"/>处写入frag.xml的所有元素值。 我的问题是我在测试相等属性值后不知道如何选择相应的元素值。 我希望有人会帮助我。

1 个答案:

答案 0 :(得分:0)

我无法完美地完成这项工作 - 现在没有XML编辑器,也没有像document()这样的在线编辑器调用,但这是你正在寻找的东西。

第一个模板是identity transform,当你想要“保留大部分输入文件,但只是改变一些小部分”时,它总是一个基础案例。

第二个转换匹配输入文档上的frag节点,然后用frag.xml文件中的相应节点替换它们。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="frag">
    <xsl:variable name='id' select="@id"/>
    <xsl:value-of select="document('frag.xml')//frag[@id=$id]"/>
  </xsl:template>
</xsl:stylesheet>