【发布时间】:2018-09-28 12:20:10
【问题描述】:
我希望能够从元素 B 的模板中修改元素 A 的值
XML 输入
<Parent>
<Elem1 Attr="Something" OtherAttr="Other">ExistingValue</Elem1>
<Elem2 Attr="SomethingElse" />
</Parent>
XSL
<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:strip-space elements="*"/>
<!-- identity transform -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="Elem1">
<!-- SOMEHOW MODIFY HERE VALUE OF ELEM2 -->
</xsl:template>
</xsl:stylesheet>
预期的 XML 输出
<Parent>
<Elem1 Attr="Something" OtherAttr="Other">ExistingValue</Elem1>
<Elem2 Attr="SomethingElse">Value from elem1</Elem2>
</Parent>
【问题讨论】:
-
我不清楚您希望做什么。如果您有一个匹配
Elem1的模板并且想要处理Elem2兄弟,那么您当然可以通过选择例如following-sibling::Elem2。不确定您希望对该元素做什么,除非您想中断已建立的处理并使用xsl:for-each或 (XSLT 3)xsl:copy-of select="following-sibling::Elem2"处理它。 -
您给出的示例没有显示从
Elem1数据中获取的任何值,并且您没有阻止Elem2的基于身份的处理,所以我不确定您要在哪里以及为什么要中断正常处理。 -
不要依赖 elem1 和 elem 2 是兄弟姐妹,它们可以在 xml 中的任何位置。我的观点是能够根据元素 1 的属性修改元素 2 的值,但它必须在 elem1 模板匹配中提供。现在清楚了吗?
-
通常的方法是写一个
xsl:template match="Elem2",然后从例如选择/拉取任何值。//Elem1或//Elem1/@foo.
标签: xml xslt xslt-1.0 xslt-2.0