1

ここで同様の質問をしましたが、解決されました。

ただし、ヘッダー値が 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>

2 つのタイプを区別する方法 (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) ) 可能?

追加の質問として、これら 2 つのメソッドを 1 つの XSLT に入れることは可能でしょうか?

前もって感謝します

4

1 に答える 1

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>
于 2012-12-17T15:33:30.363 に答える