Как создать несколько таблиц HTML с динамическими идентификаторами таблиц в XSLT

0

Я пытаюсь динамически строить таблицы html в таблице стилей. В настоящее время я использую рекурсию для построения таблиц, но мне нужен какой-то тип JavaScript для управления присутствием этих таблиц. Именно здесь вступают в силу идентификаторы таблиц.

Вот мой лист стилей.

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"     xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl">
  <xsl:output method="xml" indent="yes"/>
  <xsl:template match="/">
    <a href="#" onclick="showtable('test1'); return false;">Hide Table 1</a>
    <a href="#" onclick="showtable('test2'); return false;">Hide Table 2</a>
    <a href="#" onclick="showtable('test3'); return false;">Hide Table 3</a>
    <xsl:call-template name="Recursion">
      <xsl:with-param name="Person" select="0"/>
      <xsl:with-param name="tableID" select="0"/>
    </xsl:call-template>
  </xsl:template>
  <xsl:template name="Recursion">
    <xsl:param name="Person"/>
    <xsl:param name="tableID"/>
    <xsl:variable name="Count" select="count(//Table1)"/>
    <xsl:choose>
      <xsl:when test="$Person&lt;$Count">
        <xsl:call-template name="NewTable">
          <xsl:with-param name="Person" select="$Person"/>
          <xsl:with-param name="tableID" select="$tableID+1"/>
        </xsl:call-template>
      </xsl:when>
      <xsl:otherwise>

      </xsl:otherwise>
    </xsl:choose>
    <xsl:choose>
      <xsl:when test="$Person&lt;$Count">
        <xsl:call-template name="Recursion">
          <xsl:with-param name="Person" select="$Person+5"/>
        </xsl:call-template>
      </xsl:when>
      <xsl:otherwise>

      </xsl:otherwise>
    </xsl:choose>
  </xsl:template>
  <xsl:template name="NewTable">
    <xsl:param name="Person"/>
    <xsl:param name="tableID"/>
    <html>
      <head>
        <script type="text/javascript">
          function showHide(id) {

          if (document.getElementById(id).style.display == "none") {
          document.getElementById(id).style.display = '';
          }

          else {
          document.getElementById(id).style.display = "none";
          }

          }
        </script>
      </head>
      <body>
        <table id="$tableID" border="5">
          <thead>
            <xsl:for-each select="/*/*[1]/*">
              <th>
                <xsl:value-of select="translate(local-name(), '_', ' ')"/>
              </th>
            </xsl:for-each>
          </thead>
          <tbody>
            <xsl:variable name="Person1" select="$Person+1"/>
            <xsl:variable name="Person2" select="$Person+2"/>
            <xsl:variable name="Person3" select="$Person+3"/>
            <xsl:variable name="Person4" select="$Person+4"/>
            <xsl:variable name="Person5" select="$Person+5"/>
            <tr>
              <xsl:for-each select="/*/*[$Person1]/*">
                <xsl:variable name="Attribute" select="position()"/>
                <td>
                  <xsl:value-of select="/*/*[$Person1]/*[$Attribute]"/>
                </td>
              </xsl:for-each>
            </tr>
            <tr>
              <xsl:for-each select="/*/*[$Person2]/*">
                <xsl:variable name="Attribute" select="position()"/>
                <td>
                  <xsl:value-of select="/*/*[$Person2]/*[$Attribute]"/>
                </td>
              </xsl:for-each>
            </tr>
            <tr>
              <xsl:for-each select="/*/*[$Person3]/*">
                <xsl:variable name="Attribute" select="position()"/>
                <td>
                  <xsl:value-of select="/*/*[$Person3]/*[$Attribute]"/>
                </td>
              </xsl:for-each>
            </tr>
            <tr>
              <xsl:for-each select="/*/*[$Person4]/*">
                <xsl:variable name="Attribute" select="position()"/>
                <td>
                  <xsl:value-of select="/*/*[$Person4]/*[$Attribute]"/>
                </td>
              </xsl:for-each>
            </tr>
            <tr>
              <xsl:for-each select="/*/*[$Person5]/*">
                <xsl:variable name="Attribute" select="position()"/>
                <td>
                  <xsl:value-of select="/*/*[$Person5]/*[$Attribute]"/>
                </td>
              </xsl:for-each>
            </tr>
          </tbody>
        </table>
      </body>
    </html>
  </xsl:template>
</xsl:stylesheet>

Когда я применяю таблицу стилей, я получаю желаемые результаты для создаваемых таблиц и количество людей в таблице стилей, которое не превышает 5. Единственное, что меня пугает, - это установить идентификаторы таблиц как уникальные. Этот текущий лист стилей задает идентификатор таблицы $ tableID буквально.

Мой вопрос: как установить идентификатор таблиц равным переменной или хотя бы сделать каждый идентификатор таблицы уникальным и иметь возможность отслеживать его, чтобы его можно было использовать в методе JavaScript над таблицей.

Вот входной XML файл.

<?xml version="1.0" encoding="utf-8" ?>
<NewDataSet>
  <Table1>
    <Run_Date>2013-12-21</Run_Date>
    <Run_Time>9:30</Run_Time>
    <Date_Ending>2013-12-7</Date_Ending>
    <Invoice_Number>00001</Invoice_Number>
    <Invoice_Date>2013-12-1</Invoice_Date>
    <Due_Date>2013-12-31</Due_Date>
  </Table1>
  <Table1>
    <Run_Date>2013-12-21</Run_Date>
    <Run_Time>9:30</Run_Time>
    <Date_Ending>2013-12-7</Date_Ending>
    <Invoice_Number>00001</Invoice_Number>
    <Invoice_Date>2013-12-1</Invoice_Date>
    <Due_Date>2013-12-31</Due_Date>
  </Table1>
</NewDataSet>

И я получаю этот вывод

<Table id="$tableID" border="5">

но я хочу этот вывод

<!-- Obviously this is a very dumbed down version of my expected output. I just need the table IDs 
increment by one.-->
<Table id="1" border="5">

<Table id="2" border="5">

Любой вход очень приветствуется. Если вы захотите, вы можете дать мне представление о том, как получить идентификатор, который будет добавлен в тег JavaScript динамически, а также, но я должен уметь отображать эту часть.

Заранее спасибо.

Теги:
html-table
xslt
recursion

1 ответ

0
Лучший ответ

Тебе нужно

 <table id="{$tableID}" b

с {} чтобы оценивалось выражение Xpath в значении атрибута.

Хотя кодирование довольно неэффективно, поскольку вы рекурсируете "вручную", а затем повторно извлекаете элементы из корня дерева

/*/*[$Person3]/*">

а не просто позволить <xsl:apply-templates/> естественно относиться к каждой таблице.

  • 0
    Большое спасибо. Я также обнаружил, что <xsl: attribute name = "id"> <xsl: value-of select = "$ tableID" /> </ xsl: attribute> также оказался полезным. Я даже не думал о том, чтобы делать это в сквирли.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню