我正在尝试使用我的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。
任何想法
答案 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
。相反,它依赖于多个模板来模块化输入的每个部分的处理。