2

XML に編集する

ノードが存在しないか、テンプレート マッチングを使用して NULL という単語が含まれているかどうかをテストする方法を理解しようとしています。現在、一致したテンプレートで <xsl:choose> テストを使用しています。このテストを行うためのより効率的な方法はありますか?

または ノードが eixt でない場合、または NULL という単語が含まれている場合、XML では、そのノードを完全にスキップして、そのノードが正しくない理由を示すステートメントを出力します (つまり、「タイトルが存在しません」または「コンテンツが NULL です」 」)。

XML では、3 番目と 4 番目のノードはコンテンツを表示せず、代わりにコンテンツが表示されなかった理由を示すステートメントを出力する必要があります。

テストに使用している 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>
    <DESC>Description 3</DESC>
    <CONTENT>Content 3</CONTENT>
  </FIGURE>
  <FIGURE>
    <TITLE>Title 4</TITLE>
    <DESC>Description 4</DESC>
    <CONTENT>NULL</CONTENT>
  </FIGURE>     
  <FIGURE>
    <TITLE>Title 5</TITLE>
    <DESC>Description 5</DESC>
    <CONTENT>Content 5</CONTENT>
  </FIGURE>
</FIGURES>

私が使用しているXSLTは次のとおりです。

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" encoding="utf-8"/>

<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">
  <xsl:choose>
    <!-- Check to see if the TITLE field is empty -->
    <xsl:when test="translate(./TITLE,' ', '') = ''">The TITLE node is empty</xsl:when>                      
    <!-- Check to see if the TITLE field is NULL -->
    <xsl:when test="normalize-space(./TITLE) = 'NULL'">The TITLE node is NULL</xsl:when> 
    <!-- Check to see if the CONTENT field is empty -->
    <xsl:when test="translate(./CONTENT,' ', '') = ''">The CONTENT node is empty</xsl:when>
    <!-- Check to see if the CONTENT field is NULL -->
    <xsl:when test="normalize-space(./CONTENT) = 'NULL'">The CONTENT node is NULL</xsl:when>                                            
    <xsl:otherwise>
      <li>
        <a href="#section-{position()}">
          <h3><xsl:value-of select="TITLE" /></h3>
        </a>
        <p><xsl:value-of select="DESC" /></p>
      </li>
    </xsl:otherwise>
  </xsl:choose>
</xsl:template>

<xsl:template match="FIGURE" mode="content">
  <xsl:choose>
    <!-- Check to see if the TITLE field is empty -->
    <xsl:when test="translate(./TITLE,' ', '') = ''">The TITLE node is empty</xsl:when>                      
    <!-- Check to see if the TITLE field is NULL -->
    <xsl:when test="normalize-space(./TITLE) = 'NULL'">The TITLE node is NULL</xsl:when> 
    <!-- Check to see if the CONTENT field is empty -->
    <xsl:when test="translate(./CONTENT,' ', '') = ''">The CONTENT node is empty</xsl:when>
    <!-- Check to see if the CONTENT field is NULL -->
    <xsl:when test="normalize-space(./CONTENT) = 'NULL'">The CONTENT node is NULL</xsl:when>                                            
    <xsl:otherwise>
      <div id="section-{position()}">
        <p><xsl:value-of select="CONTENT" /></p>
      </div>
    </xsl:otherwise>
  </xsl:choose>
</xsl:template>

</xsl:stylesheet>

ありがとうございました。

4

2 に答える 2

1

これは、同じ結果を生成し、条件付きXSLT命令を使用しない短い変換です

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

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

 <xsl:template match="FIGURE">
   <li>
     <a href="#section-{position()}">
       <xsl:apply-templates select="TITLE"/>
     </a>
     <xsl:apply-templates select="DESC"/>
   </li>
 </xsl:template>

 <xsl:template match="TITLE">
   <h3><xsl:value-of select="."/></h3>
 </xsl:template>

 <xsl:template match="DESC">
   <p><xsl:value-of select="."/></p>
 </xsl:template>

 <xsl:template match="FIGURE[*[. = 'NULL' or not(normalize-space())]]">
  <xsl:apply-templates select="*[. = 'NULL' or not(normalize-space())]"/>
 </xsl:template>

 <xsl:template match="FIGURE/*[. = 'NULL']">
  The <xsl:value-of select="name()"/> node is NULL.
 </xsl:template>
 <xsl:template match="FIGURE/*[not(normalize-space())]">
  The <xsl:value-of select="name()"/> node is empty.
 </xsl:template>

 <xsl:template match="FIGURE[not(*[. = 'NULL' or not(normalize-space())])]" mode="content">
      <div id="section-{position()}">
         <p><xsl:value-of select="CONTENT"/></p>
      </div>
 </xsl:template>
 <xsl:template match="FIGURE" mode="content"/>
</xsl:stylesheet>

この変換が提供されたXMLドキュメントに適用される場合:

<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>
        <DESC>Description 3</DESC>
        <CONTENT>Content 3</CONTENT>
    </FIGURE>
    <FIGURE>
        <TITLE>Title 4</TITLE>
        <DESC>Description 4</DESC>
        <CONTENT>NULL</CONTENT>
    </FIGURE>
    <FIGURE>
        <TITLE>Title 5</TITLE>
        <DESC>Description 5</DESC>
        <CONTENT>Content 5</CONTENT>
    </FIGURE>
</FIGURES>

最初に提供された変換と同じ結果が生成されます。

<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>
  The TITLE node is empty.

  The CONTENT node is NULL.
 <li>
         <a href="#section-5">
            <h3>Title 5</h3>
         </a>
         <p>Description 5</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-5">
         <p>Content 5</p>
      </div>
   </div>
</div>
于 2013-02-20T03:31:52.850 に答える
1

これにより、基本的に XSLT と同じ結果が得られ、xsl:choose. 試してみてください:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="html" encoding="utf-8"/>

  <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[ *[self::TITLE or self::CONTENT]
                      [not(normalize-space(.)) or normalize-space(.) = 'NULL']
                   ]"
      mode="titles">
    <xsl:apply-templates select="TITLE | CONTENT" />
  </xsl:template>

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

  <xsl:template 
      match="FIGURE[ *[self::TITLE or self::CONTENT]
                      [not(normalize-space(.)) or normalize-space(.) = 'NULL']
                   ]"
      mode="content">
    <xsl:apply-templates select="TITLE | CONTENT" />
  </xsl:template>

  <xsl:template match="TITLE | CONTENT" />

  <xsl:template match="*[self::TITLE or self::CONTENT][not(normalize-space(.))]">
    <xsl:value-of select="concat('The ', local-name(), ' node is empty')"/>
  </xsl:template>

  <xsl:template match="*[self::TITLE or self::CONTENT][normalize-space(.) = 'NULL']">
    <xsl:value-of select="concat('The ', local-name(), ' node is NULL')"/>
  </xsl:template>
</xsl:stylesheet>

Please give it a try.
于 2013-02-19T21:15:08.437 に答える