Xml 使用模板参数匹配标记
是否可以使用模板参数来匹配命名空间标记?比如说Xml 使用模板参数匹配标记,xml,xslt,Xml,Xslt,是否可以使用模板参数来匹配命名空间标记?比如说 <xsl:template match="abc:tag_name"> <xsl:param name="tag_to_get" /> <xsl:if test="abc:{$tag_to_get}"><xsl:value-of select="$tag_to_get" /> tag exists</xsl:if> </xsl:template> 标签存在 编辑:
<xsl:template match="abc:tag_name">
<xsl:param name="tag_to_get" />
<xsl:if test="abc:{$tag_to_get}"><xsl:value-of select="$tag_to_get" /> tag exists</xsl:if>
</xsl:template>
标签存在
编辑:
我想转换存储在XML文档中的数据表,但不是每个元素都有相同的子元素。因此,我想迭代不同的可能的子节点,在表中创建一个新行,并测试xml文档中的每个元素是否都有可能的子节点给出的子节点。例如,给定以下XML:
<root>
<foo name="element_a">
<bar />
</foo>
<foo name="element_b">
<baz />
</foo>
</root>
我想创造
<table>
<tr>
<th>child</th>
<th>element_a</th>
<th>element_b</th>
</tr>
<tr>
<!-- Which elements have bar children -->
<td>bar</td>
<td>X</td>
<td></td>
</tr>
<tr>
<!-- Which elements have baz children -->
<td>baz</td>
<td></td>
<td>X</td>
</tr>
</table>
小孩
元素a
元素b
酒吧
X
巴兹
X
因此,前面的示例将变成:
<xsl:template match="/">
<html>
<head>
<style> table { border-collapse: collapse; font: "Trebuchet MS", sans-serif; } table, th, td { border: 1px solid black; }</style>
</head>
<body>
<table>
<tr>
<th>child</th>
<xsl:apply-templates select="root/foo"><xsl:with-param name="tag_to_get" select="'headers'" /></xsl:apply-templates>
</tr>
<tr>
<td>bar</td>
<xsl:apply-templates select="root/foo"><xsl:with-param name="tag_to_get" select="'bar'" /></xsl:apply-templates>
</tr>
<tr>
<td>baz</td>
<xsl:apply-templates select="root/foo"><xsl:with-param name="tag_to_get" select="'baz'" /></xsl:apply-templates>
</tr>
</table>
</body>
</html>
</xsl:template>
<xsl:template match="foo">
<xsl:param name="tag_to_get" />
<xsl:choose>
<xsl:when test="$tag_to_get = 'headers'">
<th><xsl:value-of select="./@name" /></th>
</xsl:when>
<xsl:otherwise>
<td><!-- <xsl:if test="{$tag_to_get}">X</xsl:if> --></td>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
表格{边框折叠:折叠;字体:“投石机MS”,无衬线;}表格,th,td{边框:1px纯黑;}
小孩
酒吧
巴兹
但是我不知道如何使用参数来匹配元素。在本例中,您可以使用local-name()函数
<xsl:if test="*[local-name()=$tag_to_get]">
<xsl:value-of select="$tag_to_get" /> tag exists
</xsl:if>
标签存在
local-name()返回不带名称空间前缀的元素的名称
最好为标题使用一个完全独立的模板,并使用模式属性将其区分开来
试试这个XSLT
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/root">
<html>
<head/>
<body>
<table>
<tr>
<th>child</th>
<xsl:apply-templates select="foo" mode="header" />
</tr>
<tr>
<td>bar</td>
<xsl:apply-templates select="foo">
<xsl:with-param name="tag_to_get" select="'bar'" />
</xsl:apply-templates>
</tr>
<tr>
<td>baz</td>
<xsl:apply-templates select="foo">
<xsl:with-param name="tag_to_get" select="'baz'" />
</xsl:apply-templates>
</tr>
</table>
</body>
</html>
</xsl:template>
<xsl:template match="foo" mode="header">
<th><xsl:value-of select="@name" /></th>
</xsl:template>
<xsl:template match="foo">
<xsl:param name="tag_to_get" />
<td>
<xsl:if test="*[local-name()=$tag_to_get]">X</xsl:if>
</td>
</xsl:template>
</xsl:stylesheet>
小孩
酒吧
巴兹
X
应用于XML时,将输出以下内容
<html>
<head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"></head>
<body><table>
<tr>
<th>child</th>
<th>element_a</th>
<th>element_b</th>
</tr>
<tr>
<td>bar</td>
<td>X</td>
<td></td>
</tr>
<tr>
<td>baz</td>
<td></td>
<td>X</td>
</tr>
</table></body>
</html>
小孩
元素a
元素b
酒吧
X
巴兹
X
能否提供一个更全面的示例,包括一个示例XML输入?还要指出您使用的XSLT版本。-在我看来,您的问题是关于使用参数匹配元素-不一定与名称空间相关。正确,我想使用参数匹配元素。我提到名称空间是因为我不确定这是否会产生影响。似乎您事先就知道输入XML的名称空间和要获取的元素名称。如果是这样,我不清楚你为什么不直接使用它们;参数化它们的唯一原因是,如果您需要在运行时将元素名传递给样式表,我希望简化代码。如果我可以使用参数来匹配子元素,那么foo的模板将与示例非常相似。否则,我需要为每个子元素都有一个分支。“我希望简化代码。”IMHO,你实现了相反的目标。发布可用于演示的更复杂的XML输入。-我们仍在等待被告知您正在使用哪个版本的XSLT。谢谢,我用正确的xml更新了示例。我正在寻找您的解决方案不允许的多个foo。另外,如果header元素不存在,foo/header模板如何匹配?我现在终于明白了!我已更正了XSLT,以提供所需的输出。