Xml 通过XSL中的多个递归模板继承属性值
假设我有一个如下所示的XML文件:Xml 通过XSL中的多个递归模板继承属性值,xml,xslt,xslt-2.0,Xml,Xslt,Xslt 2.0,假设我有一个如下所示的XML文件: <a id="x"> <b> <b> <a id="y"> <b> <c /> </b> </a> </b> <c>
<a id="x">
<b>
<b>
<a id="y">
<b>
<c />
</b>
</a>
</b>
<c>
<a id="z">
<b>
<c />
</b>
</a>
</c>
</b>
</a>
经过几个小时的工作,我终于得到了它,这样“a”、“b”和“c”模板就可以正确地递归。我留下的可能是我需要a/@id
的值在b
和c
中可用。但我还需要能够在到达内部a
时重置该值。(也就是说,在a#x>b>a#y>b>c
中,我需要值“y”,但在a#x>b>b
中,我需要值“x”。换句话说,我需要最新的a/@id
)
由于b
元素可以嵌套不确定的次数,问题变得复杂了,因此这不仅仅是执行。//../id
或其他操作的情况
因为变量或参数似乎不适用于此,所以我认为一个可接受的解决方法是自动将@id
带到每个子元素。但是,我无法找到使用xsl:attribute
实现这一点的方法,因为这似乎总是修改输出树,而不是输入树或当前处理树
有什么提示吗?你就不能只做
祖先::a[first()]/@id
<xsl:template match="a">
...
<xsl:apply-templates match="*" />
</xsl:template>
<xsl:template match="b">
<xsl:variable name="id" select="ancestor::a[first()]/@id" />
...
<xsl:apply-templates match="*" />
</xsl:template>
<xsl:template match="b">
<xsl:variable name="id" select="ancestor::a[first()]/@id" />
...
<xsl:apply-templates match="*" />
</xsl:template>
...
...
...
它实际上是祖先::a[1]/@id
,但是是的,谢谢!我盯着这个看了这么久,我都记不起我试过什么,没试过什么了。@GPHemsley:Oops。我一时想不起属性语法是什么。现在修好了。你还没有说出你想要达到的目标。