Гиперссылка на тот же документ с помощью generate-id () - PullRequest
1 голос
/ 29 июня 2011

Я пытаюсь создать ссылки на один и тот же документ с моим 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>

Пожалуйста, игнорируйте любые ошибки, это быстрый макет, но вы должны понять, что я пытаюсь сделать. Я не могу получить ссылку на соответствующий элемент. Т.е. Шаг 1 к Сравнению Result_Step1.

Любые идеи

Ответы [ 2 ]

0 голосов
/ 29 июня 2011

Вот решение, основанное на относительном положении каждого из шагов:

<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 в монолитном шаблоне. Вместо этого он использует несколько шаблонов для модульной обработки каждого раздела ввода.

0 голосов
/ 29 июня 2011

Честно говоря, я не понимаю, зачем вам генерировать 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 тогда имеет смысл, только если вы примените его к тому же узлу.

[править] Если вы хотите использовать 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...