XML 枢轴到 XML






3.50/5 (4投票s)
本文描述了如何使用 XSL 转换将现有 XML 中包含在元素中的值集合转换为另一个 XML 的有效元素。
引言
本文描述了如何使用 XSL 转换将现有 XML 中包含在元素中的值集合转换为另一个 XML 的有效元素。
概述
通常使用 Excel 的数据透视表功能或一些复杂 T-SQL 语句将任意数据集的数据透视,使其值成为列。 使用简单的 XSL 技术,可以使用 XSL 的固有函数来实现这一点:<xsl:variable/>
和 <xsl:element/>
。
为了明确起见,让我用以下常见的命名空间声明来限定 xsl
的来源
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
XML
这个简单的 XML 数据将被用来将包含在特定元素中的特定值转换为具有该值作为元素名称的有效 XML 元素。 困惑了吗?想想数据透视表!
<NewDataSet title="XMLPivotXML">
<Table>
<Arg>ArgValue123</Arg>
<CtxtKeyID>CTXT123</CtxtKeyID>
<CtxtName>ElementValue237</CtxtName>
</Table>
<Table>
<Arg>ArgValue196</Arg>
<CtxtKeyID>CTXT133</CtxtKeyID>
<CtxtName>ElementValue238</CtxtName>
</Table>
</NewDataSet>
XSL
在下面的示例中,我使用 Arg
作为要转换为元素的期望值。 请注意代码片段
<xsl:variable name='arg'><xsl:value-of select="Arg" /></xsl:variable>
目的是将所有 Arg
元素值转换为元素,这些元素的名称是它们各自的值,通过转换实现。 在以下转换中,我将 Arg
替换为源 XML 中包含的其他有效元素。 这是完整的 XSL
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >
<xsl:template match="/">
<args>
<xsl:attribute name="ContextName">
<xsl:value-of select="NewDataSet/@title"/>
</xsl:attribute>
<xsl:for-each select="//Table">
<xsl:variable name='arg'><xsl:value-of select="Arg" />
</xsl:variable>
<xsl:element name='{$arg}'/>
</xsl:for-each>
</args>
</xsl:template>
</xsl:stylesheet>
转换
使用 Arg
作为要转换的目标元素,我得到以下结果
<args ContextName="XMLPivotXML">
<ArgValue123 />
<ArgValue196 />
</args>
使用 CtxtKeyID
作为要转换的目标元素,我得到以下结果
<args ContextName="XMLPivotXML">
<CTXT123 />
<CTXT133 />
</args>
使用 CtxtName
作为要转换的目标元素,我得到以下结果
<args ContextName="XMLPivotXML">
<ElementValue237 />
<ElementValue238 />
</args>
正如你所看到的,使用这种简单的技术可以实现的可能性是巨大的。 我正在考虑将其用作接受参数的模板函数。 祝你好运,并快乐地转换!