我问了一个类似的问题here已经解决了。
但是我发现我也遇到了一个问题,数据如下所示,而不是在XML标记中包含标题值。
<results>
<body>
<line>
<a>Column 1 Customer Name</a>
<a>Column 2 Customer Add</a>
<a>Column3</a>
<a>Column4</a>
</line>
<line>
<a>Data1</a>
<a>Data2</a>
<a>Data3</a>
<a>Data4</a>
</line>
<line>
<a>Data1</a>
<a>Data2</a>
<a>Data3</a>
<a>Data4</a>
</line>
</body>
</results>
我设法找到一种方法(XSLT外部)来区分这两种类型,但需要实现相同的结果,如下所示。
<?xml version="1.0"?>
<results>
<header>
<a>Column 1 Customer Name</a>
<a>Column 2 Customer Add</a>
<a>Column3</a>
<a>Column4</a>
</header>
<body>
<line>
<Column1CustomerName>Data1</Column1CustomerName>
<Column2CustomerAdd>Data2</Column2CustomerAdd>
<Column3>Data3</Column3>
<Column4>Data4</Column4>
</line>
<line>
<Column1CustomerName>Data1</Column1CustomerName>
<Column2CustomerAdd>Data2</Column2CustomerAdd>
<Column3>Data3</Column3>
<Column4>Data4</Column4>
</line>
</body>
</results>
行数可以是无限的,但“标题”将始终是第一行。
,我有关于如何做到这一点的理论<xsl:template match="/results/body/line[0]">
然而,这就是我所拥有的。
我在想这可能更容易完成这个数据的移动,到标签“标题”所以我可以根据我问的其他问题执行变换器,但不知道这是否是a)最好的方法,或b)可能?
作为一个额外的问题,是否可以将这两种方法放在一个XSLT中?
提前致谢
答案 0 :(得分:1)
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:variable name="vNames" as="xs:string+" select=
"/*/*/line[1]/a/translate(.,' ','')"/>
<xsl:template match="/*">
<results>
<header>
<xsl:sequence select="/*/*/line[1]/a"/>
</header>
<body>
<xsl:apply-templates select="/*/*/line[position() ne 1]"/>
</body>
</results>
</xsl:template>
<xsl:template match="line">
<line>
<xsl:apply-templates select="a"/>
</line>
</xsl:template>
<xsl:template match="a">
<xsl:variable name="vPos" select="position()"/>
<xsl:element name="{$vNames[$vPos]}"><xsl:apply-templates/></xsl:element>
</xsl:template>
</xsl:stylesheet>
在提供的XML文档上应用此转换时:
<results>
<body>
<line>
<a>Column 1 Customer Name</a>
<a>Column 2 Customer Add</a>
<a>Column3</a>
<a>Column4</a>
</line>
<line>
<a>Data1</a>
<a>Data2</a>
<a>Data3</a>
<a>Data4</a>
</line>
<line>
<a>Data1</a>
<a>Data2</a>
<a>Data3</a>
<a>Data4</a>
</line>
</body>
</results>
产生了想要的正确结果:
<results>
<header>
<a>Column 1 Customer Name</a>
<a>Column 2 Customer Add</a>
<a>Column3</a>
<a>Column4</a>
</header>
<body>
<line>
<Column1CustomerName>Data1</Column1CustomerName>
<Column2CustomerAdd>Data2</Column2CustomerAdd>
<Column3>Data3</Column3>
<Column4>Data4</Column4>
</line>
<line>
<Column1CustomerName>Data1</Column1CustomerName>
<Column2CustomerAdd>Data2</Column2CustomerAdd>
<Column3>Data3</Column3>
<Column4>Data4</Column4>
</line>
</body>
</results>