在xslt中嵌入和引用xml片段

时间:2014-05-13 21:27:14

标签: xml xslt

我使用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

非常感谢!

2 个答案:

答案 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