我使用xslt转换xml doc。
在某些情况下,我需要在xslt doc中为模板提供一小段xml(未包含在xml doc中)。
如果不引入第二个xml文档,我将如何实现这一目标?具体来说,我如何在xslt doc中嵌入此代码段?我将如何在xslt doc中引用它,以便将其传递给模板?
在进行多次网络搜索后,我一直无法找到此用例的示例。
这里是简化形式的用例:
XSLT
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<snippet>
<el att1="c"/>
</snippet>
<xsl:template match="root">
<xsl:apply-templates select="el"/>
<xsl:apply-templates select="snippet/el"/>
</xsl:template>
<xsl:template match="el">
<xsl:value-of select="@att1"/>
</xsl:template>
</xsl:stylesheet>
XML
<root>
<el att1="a"/>
<el att1="b"/>
</root>
预期产出:
abc
非常感谢!
答案 0 :(得分:3)
在XSLT 2.0中,您只需创建一个包含所需内容的变量,然后直接应用模板,例如
。<xsl:variable name="snippet">
<el att1="c"/>
</xsl:variable>
然后
<xsl:apply-templates select="$snippet/el" />
这在1.0中不起作用,但您可以使用带有空字符串参数的document
函数的技巧将XSLT样式表本身称为XML树。
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:variable name="snippet">
<el att1="c"/>
</xsl:variable>
<xsl:template match="root">
<xsl:apply-templates select="el"/>
<xsl:apply-templates
select="document('')/*/xsl:variable[@name='snippet']/el"/>
</xsl:template>
<xsl:template match="el">
<xsl:value-of select="@att1"/>
</xsl:template>
</xsl:stylesheet>
在这两种情况下,您需要注意,因为您正在处理的节点不在主输入XML树中,所以/
可能并不意味着您的想法。 /
是指包含当前上下文节点的树的根节点,因此对于XSLT 2.0示例,它将是临时树的根节点,其中el
作为直接子节点,在XSLT 1.0版本中,它将是样式表树的根,其中xsl:stylesheet
为其子项。
答案 1 :(得分:2)
我不太了解你的例子。这是一个简单的:
XSLT 1.0
<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:copy>
<xsl:apply-templates select="el"/>
<el att1="c"/>
</xsl:copy>
</xsl:template>
<xsl:template match="el">
<xsl:copy-of select="."/>
</xsl:template>
</xsl:stylesheet>
当此功能应用于输入:
时<root>
<el att1="a"/>
<el att1="b"/>
</root>
结果是:
<?xml version="1.0" encoding="UTF-8"?>
<root>
<el att1="a"/>
<el att1="b"/>
<el att1="c"/>
</root>
使用您的示例:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" encoding="UTF-8"/>
<xsl:template match="root">
<xsl:apply-templates select="el"/>
<xsl:text>c</xsl:text>
</xsl:template>
<xsl:template match="el">
<xsl:value-of select="@att1"/>
</xsl:template>
</xsl:stylesheet>
产生
abc