简短问题:有没有办法在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
任何见解都会有所帮助。
答案 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> </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
之类的扩展函数来进一步处理它们。