XSLT协助 - 重复数据(第2部分)

时间:2012-12-17 15:07:21

标签: xml xslt xslt-2.0 transformation repeat

我问了一个类似的问题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中?

提前致谢

1 个答案:

答案 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>