【发布时间】:2014-02-06 15:14:39
【问题描述】:
我正在尝试使用 XSLT 重新格式化一些 XML。我输入的 sn-p 如下所示:
<toggles>
<toggle toggleDisplayName="Charges">
<anotherElement attribute="value" />
<gridColumn sourceField.name="FIELD1" />
<gridColumn sourceField.name="FIELD2" />
<gridColumn sourceField.name="FIELD3" />
</toggle>
</toggles>
我想将所有“gridColumn”元素包装成一个“网格”元素,如下所示:
<toggles>
<toggle toggleDisplayName="Charges">
<anotherElement attribute="value" />
<grid>
<gridColumn sourceField.name="FIELD1" />
<gridColumn sourceField.name="FIELD2" />
<gridColumn sourceField.name="FIELD3" />
</grid>
</toggle>
</toggles>
我当前的 XSLT 是:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt"
exclude-result-prefixes="msxsl">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="toggle/gridColumn">
<grid>
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</grid>
</xsl:template>
<!--Identity transform for remaining-->
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
现在这种工作,但我得到每个 'gridColumn' 元素在它自己的 'grid' 元素。是否有任何简单的方法可以修改它,以便我可以获得上述结果?
注意:已编辑以阐明输入 XML。
提前感谢您的帮助!
【问题讨论】:
-
为
<toggle>创建一个模板,将<grid>包裹在其子项周围。 -
对不起,我的 XML 很长,所以可能我删掉了太多。 “toggle”下还有其他不是“gridColumns”的元素。您提出的方法会将“切换”的所有子元素包装到“网格”元素中,这不是我想要做的。
-
为
<toggle>创建一个模板,将<grid>包裹在其<gridColumn>子代周围,然后在包含的<xsl:apply-templates>中指定后者。或者澄清要求,如果我仍然误解你。 -
"
toggle下还有其他不是gridColumns的元素" - 所有gridColumn元素都相邻吗?如果不是,您是要将它们全部聚集到一个组中还是只将相邻的一组(这样您最终在输出中会得到多个grid)?