内存中向模型XML元素添加属性

时间:2014-08-11 19:44:27

标签: xml xslt xslt-1.0

简短问题:有没有办法在XSL中将属性附加到模型XML树中,以便稍后可以检索/使用该属性值?

基本上,我有一个XML数据集,我可以通过这种方式知道“property”元素是一个叶子元素,而不是拥有子“property”元素。对于每个叶元素,我调用一个模板,通过该模板生成点符号全名并存储为变量。我想将该变量作为属性附加到该元素的XML数据模型中。这将允许我进行进一步处理,即对属性值进行排序。这可能。

例如,如果我有以下XML:

<property name="a">
    <property name="z" />
    <property name="w" />
    <property name="b">
       <property name="c" />
       <property name="b" />
    </property>
</property>

我想要以下输出:

a.b.b
a.b.c
a.w
a.z

任何见解都会有所帮助。

2 个答案:

答案 0 :(得分:1)

这是使用XSLT 1.0生成所需输出的一种方法:

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:exsl="http://exslt.org/common"
extension-element-prefixes="exsl">

<xsl:output method="text" encoding="UTF-8"/>

<xsl:template match="/">
    <!-- first pass -->
    <xsl:variable name="leaves">
        <xsl:for-each select="//property[not(*)]">
            <property>
                <xsl:for-each select="ancestor-or-self::*">
                    <xsl:value-of select="@name" />
                    <xsl:if test="position()!=last()">
                        <xsl:text>.</xsl:text>
                    </xsl:if>
                </xsl:for-each>
            </property>
        </xsl:for-each>
    </xsl:variable>

    <!-- output -->
        <xsl:for-each select="exsl:node-set($leaves)/property">
            <xsl:sort/>
            <xsl:value-of select="."/>
            <xsl:if test="position()!=last()">
                <xsl:text>&#10;</xsl:text>
            </xsl:if>
        </xsl:for-each>
</xsl:template>

</xsl:stylesheet>

应用于您的更正输入:

<property name="a">
    <property name="z" />
    <property name="w" />
    <property name="b">
       <property name="c" />
       <property name="b" />
    </property>
</property>

(text!)结果是:

a.b.b
a.b.c
a.w
a.z

答案 1 :(得分:0)

您无法操纵任何输入树,但可以创建临时树并在一次转换中实现不同的操作步骤。使用XSLT 2.0很简单,使用1.0时,您需要在任何树片段上使用exsl:node-set之类的扩展函数来进一步处理它们。