我是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的所有元素值。
我的问题是我在测试相等属性值后不知道如何选择相应的元素值。
我希望有人会帮助我。
答案 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>