使用generate-id()超链接到同一文档

时间:2011-06-29 15:55:50

标签: xml xslt dom

我正在尝试使用我的XML和XSLT创建指向同一文档的链接。我正在尝试使用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。

任何想法

2 个答案:

答案 0 :(得分:0)

坦率地说,我不明白为什么你需要generate-id,只要这些名称是独特的,然后再做。

<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,那么只有将它应用于同一节点才有意义。

[edit]如果你想使用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>

答案 1 :(得分: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。相反,它依赖于多个模板来模块化输入的每个部分的处理。