Я пытаюсь динамически строить таблицы 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<$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<$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 динамически, а также, но я должен уметь отображать эту часть.
Заранее спасибо.
Тебе нужно
<table id="{$tableID}" b
с {}
чтобы оценивалось выражение Xpath в значении атрибута.
Хотя кодирование довольно неэффективно, поскольку вы рекурсируете "вручную", а затем повторно извлекаете элементы из корня дерева
/*/*[$Person3]/*">
а не просто позволить <xsl:apply-templates/>
естественно относиться к каждой таблице.