2

私は XSL の初心者であり、学習しながら学んでいます。私は現在、ローカルで作成された XML 用のサード パーティのスタイルシートを編集しています。その一部は次のようになります。

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl">

<c01>
    <did>
        <unittitle>Annual Reports</unittitle>
        <physdesc>19 folders</physdesc>                                   
    </did>
    <scopecontent>
        <p>Annual reports...</p>
    </scopecontent>
    <c02>
        <did>
            <container type="box">1</container>
            <container type="folder">1</container>
            <unittitle>1839-40, 1846 (SPP); 1852 (BPA); 1854 (SPP)</unittitle>
        </did>
    </c02>
    <c02>
         <did>
            <container type="folder">2</container>
            <unittitle>1869, 1872 (BPA); 1873 (IAS)</unittitle>
         </did>
    </c02>

<c01>
     <did>
         <unittitle>Bulletins</unittitle>
         <physdesc>2 folders</physdesc>
     </did>
     <scopecontent>
         <p>Bulletins...</p>
     </scopecontent>
     <c02>
         <did>
             <container type="box">1</container>
             <container type="folder">21</container>
             <unittitle>Bulletins 1945-46</unittitle>
         </did>
     </c02>
     <c02>
         <did>
         <container type="box">2</container>
         <container type="folder">1</container>
         <unittitle>Bulletins 1946-51</unittitle>
         </did>
     </c02>
</c01>

<c01>多くの、 などのテーブルを作成する XSL を使用すると、<c02>部分的に次のようになります。

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="html" encoding="ISO-8859-1" doctype-public="-//W3C//DTD HTML 4.0 Transitional//EN"/>

<xsl:template match="c02/did">
<tr>    
    <xsl:choose>
        <xsl:when test="ancestor::c01/descendant::c02/did/container">
            <xsl:if test="position()=1">
                <th><xsl:value-of select="container[1]/@type"/></th>
                <th><xsl:value-of select="container[2]/@type"/></th>
            </xsl:if>
        </xsl:when>
        <xsl:otherwise></xsl:otherwise>
    </xsl:choose>
</tr>
</xsl:template>

XSL でこのテンプレートの前にテーブルが作成され、複数の列が作成されます。最初の 2 つの列には、 (通常は「ボックス」と「フォルダー」)<th>をプルするがあります。<container type>それぞれ<container type>が ごとに 1 回だけ表示<c01>され、最初の から取得する必要があり<c02>ます。が<c02>1 つしかない<container type>場合もあれば、<c01>複数<c02>の があり両方が<container type="box">&の場合もあり<container type="folder">ます。

/の多くのバリエーションposition()=1と使用を試しましたが、考えられるほとんどすべてです。&のインスタンスごとに常に a を表示するか、が 2 つあるたびに s を表示します。<xsl:choose><xsl:when><th><container type="box"><container type="folder"><th><container type>

何か案は?

実際の (望ましくない) 出力で更新する
望ましい/実際の XML 出力を提供するように求められました。これは、実際の HTML 出力を伝えるための私の最善の試みです (コピー/貼り付けができない<c01>ため</scopecontent>)。

<tr>
<th>Box</th>
<th>Folder</th>
</tr>

<tr>
<td>1</td>
<td>1</td>
<td>1839-40, 1846 (SPP); 1852 (BPA); 1854 (SPP)</td>
</tr>

<tr>
<th>Folder</th>
</tr>

<tr>
<td></td>
<td>2</td>
<td>1869, 1872 (BPA); 1873 (IAS)</td>
</tr>

...

<tr>
<th>Box</th>
<th>Folder</th>
</tr>

<tr>
<td>1</td>
<td>21</td>
<td>Bulletins 1945-46</td>
</tr>

<tr>
<th>Box</th>
<th>Folder</th>
</tr>

<tr>
<td>2</td>
<td>1</td>
<td>Bulletins 1946-51</td>
</tr>

望ましい出力

<tr>
<th>Box</th>
<th>Folder</th>
</tr>

<tr>
<td>1</td>
<td>1</td>
<td>1839-40, 1846 (SPP); 1852 (BPA); 1854 (SPP)</td>
</tr>

<tr>
<td></td>
<td>2</td>
<td>1869, 1872 (BPA); 1873 (IAS)</td>
</tr>

...

<tr>
<th>Box</th>
<th>Folder</th>
</tr>

<tr>
<td>1</td>
<td>21</td>
<td>Bulletins 1945-46</td>
</tr>

<tr>
<td>2</td>
<td>1</td>
<td>Bulletins 1946-51</td>
</tr>
4

1 に答える 1

1

さて、最初はこれはミュンヒアンのグループ化を必要とするグループ化の問題だと思いました。

しかし、それから私はよく見て、考えを変えました。これが私がそれをする方法です:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:output method="html" encoding="ISO-8859-1"
    doctype-public="-//W3C//DTD HTML 4.0 Transitional//EN" />

  <xsl:template match="c01">
    <xsl:variable name="c01ID" select="generate-id()" />
    <tr>
      <xsl:for-each select="c02[1]//container">
        <th>
          <xsl:value-of select="@type" />
        </th>
      </xsl:for-each>
    </tr>
    <xsl:apply-templates select="c02" />
  </xsl:template>

  <xsl:template match="c02/did">
    <tr>
      <xsl:variable name="contextDid" select="." />
      <xsl:for-each select="ancestor::c01/c02[1]//container/@type">
        <xsl:variable name="currentType" select="." />

        <td>
          <xsl:value-of
            select="$contextDid/container[@type = $currentType]/text()" />
        </td>
      </xsl:for-each>

      <xsl:for-each select="unittitle">
        <td>
          <xsl:value-of select="." />
        </td>
      </xsl:for-each>
    </tr>
  </xsl:template>
</xsl:stylesheet>

次のサンプル入力に対して実行した場合:

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl"?>

<root>
  <c01>
    <did>
      <unittitle>Annual Reports</unittitle>
      <physdesc>19 folders</physdesc>
    </did>
    <scopecontent>
      <p>Annual reports...</p>
    </scopecontent>
    <c02>
      <did>
        <container type="box">1</container>
        <container type="folder">1</container>
        <unittitle>1839-40, 1846 (SPP); 1852 (BPA); 1854 (SPP)</unittitle>
      </did>
    </c02>
    <c02>
      <did>
        <container type="folder">2</container>
        <unittitle>1869, 1872 (BPA); 1873 (IAS)</unittitle>
      </did>
    </c02>
  </c01>

  <c01>
    <did>
      <unittitle>Bulletins</unittitle>
      <physdesc>2 folders</physdesc>
    </did>
    <scopecontent>
      <p>Bulletins...</p>
    </scopecontent>
    <c02>
      <did>
        <container type="box">1</container>
        <container type="folder">21</container>
        <unittitle>Bulletins 1945-46</unittitle>
      </did>
    </c02>
    <c02>
      <did>
        <container type="box">2</container>
        <container type="folder">1</container>
        <unittitle>Bulletins 1946-51</unittitle>
      </did>
    </c02>
  </c01>
</root>

目的の出力を生成します。

<tr>
   <th>box</th>
   <th>folder</th>
</tr>

<tr>
   <td>1</td>
   <td>1</td>
   <td>1839-40, 1846 (SPP); 1852 (BPA); 1854 (SPP)</td>
</tr>    

<tr>
   <td></td>
   <td>2</td>
   <td>1869, 1872 (BPA); 1873 (IAS)</td>
</tr>


<tr>
   <th>box</th>
   <th>folder</th>
</tr>

<tr>
   <td>1</td>
   <td>21</td>
   <td>Bulletins 1945-46</td>
</tr>

<tr>
   <td>2</td>
   <td>1</td>
   <td>Bulletins 1946-51</td>
</tr>
于 2012-09-21T02:08:19.603 に答える