Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml 使用模板参数匹配标记_Xml_Xslt - Fatal编程技术网

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,以提供所需的输出。