2016-06-22 9 views
0

私のXMLには何らかのリソースの説明が含まれています。このリソースのJSON、XMLなどの表現でHTMLを構築したいと思います。ここでXMLをカップル表現でHTMLに変換する

はXMLです:

<?xml version="1.0" encoding="UTF-8"?> 
<resources> 
    <resource name="item"> 
     <parameters> 
      <parameter name="id"> 
       <example-value>1234</example-value> 
       <type>integer</type> 
      </parameter> 
      <parameter name="name"> 
       <example-value>parameter</example-value> 
       <type>string</type> 
      </parameter> 
      <parameter name="timestamp"> 
       <example-value>1466589751</example-value> 
       <type>integer</type> 
      </parameter> 
      <parameter name="status"> 
       <example-value>1</example-value> 
       <type>integer</type> 
      </parameter> 
     </parameters> 
    </resource> 
</resources> 

をそしてここで私はそれを行う方法です。

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 
    <xsl:template match="/"> 
     <html> 
      <xsl:apply-templates/> 
     </html> 
    </xsl:template> 
    <xsl:template match="resources"> 
     <body> 
      <xsl:apply-templates/> 
     </body> 
    </xsl:template> 
    <xsl:template match="resource"> 
     <div> 
      <h2> 
       <xsl:value-of select="@name"/> 
      </h2> 
      <xsl:apply-templates/> 
     </div> 
    </xsl:template> 
    <xsl:template match="parameters"> 
     <h3> 
      <xsl:text>Examples</xsl:text> 
     </h3> 
     <div> 
      <xsl:call-template name="CSVExample"/> 
      <xsl:call-template name="TableExample"/> 
      <xsl:call-template name="JSONExample"/> 
      <xsl:call-template name="XMLExample"/> 
     </div> 
    </xsl:template> 
    <xsl:template name="CSVExample"> 
     <div> 
      <pre> 
       <xsl:for-each select="parameter"> 
        <xsl:value-of select="concat('&quot;',@name,'&quot;')"/> 
        <xsl:if test="position() &lt; last()"> 
         <xsl:text>,</xsl:text> 
        </xsl:if> 
       </xsl:for-each> 
       <xsl:text>&#xa;</xsl:text> 
       <xsl:for-each select="parameter"> 
        <xsl:value-of select="concat('&quot;',example-value,'&quot;')"/> 
        <xsl:if test="position() &lt; last()"> 
         <xsl:text>,</xsl:text> 
        </xsl:if> 
       </xsl:for-each> 
      </pre> 
     </div> 
    </xsl:template> 
    <xsl:template name="TableExample"> 
     <div> 
      <pre> 
       <table> 
        <tr> 
         <xsl:for-each select="parameter"> 
          <th> 
           <xsl:value-of select="@name"/> 
          </th> 
         </xsl:for-each> 
        </tr> 
        <tr> 
         <xsl:for-each select="parameter"> 
          <td> 
           <xsl:value-of select="example-value"/> 
          </td> 
         </xsl:for-each> 
        </tr> 
       </table> 
      </pre> 
     </div> 
    </xsl:template> 
    <xsl:template name="JSONExample"> 
     <div> 
      <pre> 
       <xsl:text>{</xsl:text> 
       <xsl:for-each select="parameter"> 
        <xsl:value-of select="concat('&quot;',@name,'&quot;:')"/> 
        <xsl:if test="type = 'string'"> 
         <xsl:text>"</xsl:text> 
        </xsl:if> 
        <xsl:value-of select="example-value"/> 
        <xsl:if test="type = 'string'"> 
         <xsl:text>"</xsl:text> 
        </xsl:if> 
        <xsl:if test="position() &lt; last()"> 
         <xsl:text>,</xsl:text> 
        </xsl:if> 
       </xsl:for-each> 
       <xsl:text>}</xsl:text> 
      </pre> 
     </div> 
    </xsl:template> 
    <xsl:template name="XMLExample"> 
     <div> 
      <pre> 
       <parameters> 
        <xsl:for-each select="parameter"> 
         <xsl:element name="{@name}"> 
          <xsl:value-of select="example-value"/> 
         </xsl:element> 
        </xsl:for-each> 
       </parameters> 
      </pre> 
     </div> 
    </xsl:template> 
</xsl:stylesheet> 

あなたはこのようなケースを行うための正しい方法だと思いますか?私は、テンプレートの構造、呼び出し、適用などを意味します。 for-eachをsome-apply-templatesに置き換えてもいいですか?私はどこかで、〜を避けるほうがよい、それぞれをapply-templatesに賛成すると読んでいます。しかし、この場合は本当ですか?

答えて

1

私は、あなたのxslを再加工するための多くの代替方法について議論することができますが、これは正しいフォーラムではありません。本当にStack Exchangeのコードレビューフォーラムを使用する必要があります。

あなたのxsl構造は一般的には良いと思います。このサイトのほとんどよりも優れています。

しかし、<パラメータ>子なしで終了する場合は、< <パラメータ>ノードでは、依然として不要な(?)コンテンツが生成されます。

apply-templatesをmode属性で使用する方がよいでしょう。

<xsl:template match="properties" mode="CSVExample"> 
.... 
</xsl:template> 

とするために、各または適用-テンプレートbetwee決定するよう

<xsl:apply-templates select="." mode="CSVExample"/> 

でコールテンプレートを置き換える:=「」選択を使用している場合、私はそれが一般的にどの方法を重要と思ういけませんあなたが行く。個人的には、毎回apply-templatesを選択しました。コードがもっと綺麗に見えたり、理解しやすいようになるたびに、柔軟性があり、for-eachのみを使用します。

関連する問題