2011-06-29 8 views
1

XMLとXSLTで同じ文書へのリンクを作成しようとしています。私はgenerate-id()を使用してインデックスを作成し、それぞれの項目のアンカーを作成しようとしています。generate-id()で同じ文書へのハイパーリンク

問題は、要素名はXMLでは同じではありませんが、私はそれにリンクしたいと思います。例えば

XML:

<testresults> 
     <test testname="ComparisonResult"> 
     <step stepname="Step1"> 
      <result>true</result> 
     </step> 
     <step stepname="Step2" > 
      <result>true</result> 
     </step> 
     </test> 
     <step stepname="results" stepresult="true"> 
     <drilldown> 
      <taskresults> 
      <testResults> 
       <test testname="ComparisonResult_Step1"> 

       </test> 
       <test testname="ComparisonResult_Step2"> 

       </test> 
      </testResults> 
      </taskresults> 
     </drilldown> 
     </step> 

    </testresults> 

XSLT:

<?xml version="1.0" encoding="UTF-8" ?> 
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
     <xsl:template match="/"> 
     <html> 
      <body> 
      <font face="Arial" size="2"> 

      <h4>Steps</h4> 


     <table border="1" bordercolor="#000000"> 
        <tr bgcolor="#dccdc"> 
        <th align="center">Task</th> 
        </tr> 

     <xsl:for-each select="testresults/test/step"> 
        <tr> 
         <td bgcolor="#F2F5A9">     
         <a href="#{generate-id(@stepname)}"> 
         <xsl:value-of select="@stepname" /> 
         </a>      
         </td>     

        </tr>  
        </xsl:for-each>    
        </table> 

       <h2>Test Results</h2> 

        <xsl:for-each select="testresults/step/drilldown/taskresults/testResults/test"> 

       <h3> 
       <a name="{generate-id(@testname)}"> 
        <xsl:value-of select="@testname" /> 
        </a> 
       </h3> 

       </xsl:for-each> 

       </xsl:template> 

    </xsl:stylesheet> 

、これは迅速なモックアップで間違いを無視するが、あなたがやろうと何イムのアイデアを得る必要がありますしてください。私はそれを対応するアイテムにリンクすることができません。すなわち、Step1〜ComparisonResult_Step1。

あなたが生成-IDを必要とする理由を任意のアイデアが

答えて

0

率直に言って、私はその後、例えばやっている限り、それらの名前が一意であるとして、表示されません

<xsl:for-each select="testresults/test/step"> 
        <tr> 
         <td bgcolor="#F2F5A9">     
         <a href="#{concat(parent::test/@testname, '_', @stepname)}"> 
         <xsl:value-of select="@stepname" /> 
         </a>      
         </td>     

        </tr>  
        </xsl:for-each>    
        </table> 

       <h2>Test Results</h2> 

        <xsl:for-each select="testresults/step/drilldown/taskresults/testResults/test"> 

       <h3> 
       <a name="{@testname}"> 
        <xsl:value-of select="@testname" /> 
        </a> 
       </h3> 

       </xsl:for-each> 

で十分です。

generate-idを使用する場合は、同じノードに適用すると意味があります。

[編集] generate-idを使用する場合は、<xsl:key name="k1" match="testresults/step/drilldown/taskresults/testResults/test" use="@testname"/>をxsl:stylesheet要素の子として追加し、次にコードを次のように変更します。

<xsl:for-each select="testresults/test/step"> 
        <tr> 
         <td bgcolor="#F2F5A9">     
         <a href="#{generate-id(key('k1', concat(parent::test/@testname, '_', @stepname)))}"> 
         <xsl:value-of select="@stepname" /> 
         </a>      
         </td>     

        </tr>  
        </xsl:for-each>    
        </table> 

       <h2>Test Results</h2> 

        <xsl:for-each select="testresults/step/drilldown/taskresults/testResults/test"> 

       <h3> 
       <a name="{generate-id()}"> 
        <xsl:value-of select="@testname" /> 
        </a> 
       </h3> 

       </xsl:for-each> 
0

ここステップの各々の相対位置に依存している溶液は次のとおり提供される入力に

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:template match="/"> 
     <html> 
      <body> 
       <font face="Arial" size="2"> 
        <xsl:apply-templates /> 
       </font> 
      </body> 
     </html> 
    </xsl:template> 
    <xsl:template match="testresults/test"> 
     <h4>Steps</h4> 
     <table border="1" bordercolor="#000000"> 
      <tr bgcolor="#dccdc"> 
       <th align="center">Task</th> 
      </tr> 
      <!-- links --> 
      <xsl:apply-templates select="step" /> 
     </table> 
    </xsl:template> 
    <xsl:template match="testresults/test/step"> 
     <xsl:variable name="pos" select="position()" /> 
     <tr> 
      <td bgcolor="#F2F5A9"> 
       <a 
        href="#{generate-id(../../step/drilldown/taskresults 
           /testResults/test[position()=$pos])}"> 
        <xsl:value-of select="@stepname" /> 
       </a> 
      </td> 
     </tr> 
    </xsl:template> 
    <xsl:template match="drilldown/taskresults/testResults"> 
     <h2>Test Results</h2> 
     <xsl:apply-templates select="test" /> 
    </xsl:template> 
    <xsl:template match="drilldown/taskresults/testResults/test"> 
     <h3> 
      <a name="{generate-id(.)}"> 
       <xsl:value-of select="@testname" /> 
      </a> 
     </h3> 
    </xsl:template> 
</xsl:stylesheet> 

<testresults> 
    <test testname="ComparisonResult"> 
     <step stepname="Step1"> 
      <result>true</result> 
     </step> 
     <step stepname="Step2"> 
      <result>true</result> 
     </step> 
    </test> 
    <step stepname="results" stepresult="true"> 
     <drilldown> 
      <taskresults> 
       <testResults> 
        <test testname="ComparisonResult_Step1"></test> 
        <test testname="ComparisonResult_Step2"></test> 
       </testResults> 
      </taskresults> 
     </drilldown> 
    </step> 
</testresults> 

を生成し:

<html> 
    <body> 
     <font face="Arial" size="2"> 
      <h4>Steps</h4> 
      <table border="1" bordercolor="#000000"> 
       <tr bgcolor="#dccdc"> 
        <th align="center">Task</th> 
       </tr> 
       <tr> 
        <td bgcolor="#F2F5A9"> 
         <a href="#d1e26">Step1</a> 
        </td> 
       </tr> 
       <tr> 
        <td bgcolor="#F2F5A9"> 
         <a href="#d1e29">Step2</a> 
        </td> 
       </tr> 
      </table> 
      <h2>Test Results</h2> 
      <h3><a name="d1e26">ComparisonResult_Step1</a></h3> 
      <h3><a name="d1e29">ComparisonResult_Step2</a></h3> 
     </font> 
    </body> 
</html> 

注:このソリューションでは、モノリシックテンプレートでfor-eachを使用していません。代わりに、複数のテンプレートを使用して入力の各セクションの処理をモジュール化します。

関連する問題