0

私の論理は正しくないと確信しています。ただし、複数のfor-eachテストなしでこれを解決する方法がわかりません。

おそらくfor-eachは正しい方法ではありませんか?アドバイスをいただければ幸いです。さらに、必要な情報がある場合に備えて、XSLT1.0を使用しています。

これが私が使用しているXMLです:

<?xml version="1.0" encoding="utf-8"?>
<FIGURES>
    <FIGURE>
        <TITLE>Title 1</TITLE>
        <DESC>Description 1</DESC>
        <CONTENT>Content 1</CONTENT>
    </FIGURE>
    <FIGURE>
        <TITLE>Title 2</TITLE>
        <DESC>Description 2</DESC>
        <CONTENT>Content 2</CONTENT>
    </FIGURE>
    <FIGURE>
        <TITLE>Title 2</TITLE>
        <DESC>Description 2</DESC>
        <CONTENT>Content 2</CONTENT>
    </FIGURE>
</FIGURES>

これが私が試しているXSLTです:

<xsl:template match="/">
  <div class="container">
    <ul class="list">

      <xsl:for-each select="//FIGURE">

        <li>
          <a href="#section-{position()}"><h3><xsl:value-of select="TITLE" /></h3></a>
          <p><xsl:value-of select="DESC" /></p>
        </li>

        <div class="content">
          <div id="section-{position()}">
            <xsl:value-of select="CONTENT" />
          </div>
        </div>                           

      </xsl:for-each>  

    </ul>    
  </div>

</xsl:template>

これが私が欲しいが得ていないHTMLです:

<div class="container">
  <ul class="list">
    <li>
      <a href="#section-1"><h3>Title 1</h3></a>
      <p>Description 1</p>
    </li>
    <li>
      <a href="#section-2"><h3>Title 2</h3></a>
      <p>Description 2</p>
    </li>   
    <li>
      <a href="#section-3"><h3>Title 3</h3></a>
      <p>Description 3</p>
    </li>
  </ul>
  <div class="content">
    <div id="section-1">
      <p>Content 1</p>
    </div>
    <div id="section-1">
      <p>Content 2</p>
    </div>  
    <div id="section-1">
      <p>Content 2</p>
    </div>          
  </div>
</div>

これが私が取得したHTMLですが、必要ありません。

<div class="container">
  <ul class="list">
    <li>
      <a href="#section-1"><h3>Title 1</h3></a>
      <p>Description 1</p>
    </li>
   <div class="content">
     <div id="section-1">Content 1</div>
   </div>
   <li>
     <a href="#section-2"><h3>Title 2</h3></a>
     <p>Description 2</p>
   </li>
   <div class="content">
     <div id="section-2">Content 2</div>
   </div>
   <li>
     <a href="#section-3"><h3>Title 2</h3></a>
     <p>Description 2</p>
   </li>
   <div class="content">
     <div id="section-3">Content 2</div>
   </div>
 </ul>
</div>

編集ショーンの例を使用して、私はそれを理解しました。タグのselect属性がありませんでした。

<xsl:template match="/">
  <div class="container">
    <xsl:apply-templates />
  </div>
</xsl:template>

<xsl:template match="FIGURES">
  <ul class="list">
    <xsl:apply-templates select="FIGURE" mode="titles" />
  </ul>  
  <div class="content">
    <xsl:apply-templates select="FIGURE" mode="content" />
  </div>
</xsl:template>

<xsl:template match="FIGURE" mode="titles">
  <li>
    <a href="#section-{position()}">
      <h3><xsl:value-of select="TITLE" /></h3>
    </a>
    <p><xsl:value-of select="DESC" /></p>
  </li>
</xsl:template>

<xsl:template match="FIGURE" mode="content">
  <div id="section-{position()}">
    <p><xsl:value-of select="CONTENT" /></p>
  </div>
</xsl:template>
4

2 に答える 2

2

このXSLT1.0スタイルシート...*

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" indent="yes" doctype-system="about:legacy-compat" encoding="UTF-8" />
<xsl:strip-space elements="*" />

<xsl:template match="/">
 <html>
   <body>
     <div class="container">
       <xsl:apply-templates />
     </div>
   </body>
 </html>
</xsl:template>

<xsl:template match="FIGURES">
  <ul class="list">
    <xsl:apply-templates mode="titles" />
  </ul>  
  <div class="content">
    <xsl:apply-templates mode="content" />
  </div>
</xsl:template>

<xsl:template match="FIGURE" mode="titles">
  <li>
    <a href="#section-{position()}">
      <h3><xsl:value-of select="TITLE" /></h3>
    </a>
    <p><xsl:value-of select="DESC" /></p>
  </li>
</xsl:template>

<xsl:template match="FIGURE" mode="content">
  <div id="section-{position()}">
    <p><xsl:value-of select="CONTENT" /></p>
  </div>
</xsl:template>

</xsl:stylesheet>

...参照された入力ドキュメントに適用すると、次のようになります。

<!DOCTYPE html SYSTEM "about:legacy-compat">
<html>
  <body>
    <div class="container">
      <ul class="list">
        <li><a href="#section-1"><h3>Title 1</h3></a><p>Description 1</p>
        </li>
        <li><a href="#section-2"><h3>Title 2</h3></a><p>Description 2</p>
        </li>
        <li><a href="#section-3"><h3>Title 2</h3></a><p>Description 2</p>
        </li>
      </ul>
      <div class="content">
        <div id="section-1">
          <p>Content 1</p>
        </div>
        <div id="section-2">
          <p>Content 2</p>
        </div>
        <div id="section-3">
          <p>Content 2</p>
        </div>
      </div>
    </div>
  </body>
</html>

アップデート

xsl:strip-spaceを使用していない場合(ソリューションでこれを示したように)、または何らかの理由で、FIGURE要素の間に他のノードが散在している場合は、このスタイルシートでより堅牢なソリューション...

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" indent="yes" doctype-system="about:legacy-compat" encoding="UTF-8" />
<xsl:strip-space elements="*" />

<xsl:template match="/">
 <html>
   <body>
     <div class="container">
       <xsl:apply-templates />
     </div>
   </body>
 </html>
</xsl:template>

<xsl:template match="FIGURES">
  <ul class="list">
    <xsl:apply-templates mode="titles" />
  </ul>  
  <div class="content">
    <xsl:apply-templates mode="content" />
  </div>
</xsl:template>

<xsl:template match="FIGURE" mode="titles">
  <li>
    <a href="#section-{count(preceding-sibling::FIGURE)+1}">
      <h3><xsl:value-of select="TITLE" /></h3>
    </a>
    <p><xsl:value-of select="DESC" /></p>
  </li>
</xsl:template>

<xsl:template match="FIGURE" mode="content">
  <div id="section-{count(preceding-sibling::FIGURE)+1}">
    <p><xsl:value-of select="CONTENT" /></p>
  </div>
</xsl:template>

</xsl:stylesheet>
于 2013-02-01T00:21:14.560 に答える
1

これが最も効率的な方法であるかどうかはわかりませんが、目的を解決する必要があります。

<xsl:template match="/">
<xsl:apply-templates select="./FIGURES"/>
</xsl:template>

<xsl:template match="FIGURES">
<html>
<body>
  <div class="container">
    <ul class="list">
      <xsl:apply-templates select="//FIGURE"/>
   </ul>
  <div class="content">
    <xsl:apply-templates select="//CONTENT"/>
  </div>
</div>
</body>
</html>
</xsl:template>

<xsl:template match="CONTENT">
<div id="section-{position()}">
<p><xsl:value-of select="."/></p>
</div>
</xsl:template>

<xsl:template match="FIGURE">
<li>
<a href="#section-{position()}">
<h3><xsl:value-of select="./TITLE"/></h3>
</a>
<p><xsl:value-of select="./DESC"/></p>
</li>
</xsl:template>
于 2013-02-01T00:16:12.827 に答える