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
使用XSLT将XML转换为表_Xml_Xslt - Fatal编程技术网

使用XSLT将XML转换为表

使用XSLT将XML转换为表,xml,xslt,Xml,Xslt,我发现一个XML包含如下数据: <?xml version="1.0" encoding="utf-8"?> <dataset xmlns:xs="http://www.w3.org/2001/XMLSchema-instance"> <metadata> <item name="Revenue" type="xs:decimal" scale="2" precision="31"/> <it

我发现一个
XML
包含如下数据:

<?xml version="1.0" encoding="utf-8"?>
<dataset  xmlns:xs="http://www.w3.org/2001/XMLSchema-instance">
    <metadata>
          <item name="Revenue" type="xs:decimal" scale="2" precision="31"/>
          <item name="Month" type="xs:short" precision="1"/>
    </metadata>
    <data>
        <row>
            <value currency="USD">100000</value>
            <value>1</value>
        </row>
        <row>
            <value currency="USD">200000.16</value>
            <value>2</value>
        </row>
        <row>
            <value currency="USD">150000.9</value>
            <value>3</value>
        </row>
        <row>
            <value currency="USD">180000.07</value>
            <value>4</value>
        </row>
    </data>
</dataset>
<table border="1">
  <tr bgcolor="#9acd32">
    <th style="text-align:left">Revenue</th>
    <th style="text-align:left">Month</th>
  </tr>
  <tr>
    <td>100000</td>
    <td>1</td>
  </tr>
  <tr>
    <td>200000.16</td>
    <td>2</td>
  </tr>
  <tr>
    <td>150000.9</td>
    <td>3</td>
  </tr>
  <tr>
    <td>180000.07</td>
    <td>4</td>
  </tr>
</table>

谁能告诉我怎么做?谢谢。

此样式表可以:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="1.0">

    <xsl:output method="html"/>

    <xsl:template match="dataset">
        <table border="1"><xsl:apply-templates /></table>
    </xsl:template>

    <xsl:template match="metadata">
        <tr bgcolor="#9acd32">
            <th style="text-align:left"><xsl:value-of select="item[1]/@name"/></th>
            <th style="text-align:left"><xsl:value-of select="item[2]/@name"/></th>
        </tr>
    </xsl:template>

    <xsl:template match="row">
        <tr><xsl:apply-templates /></tr>
    </xsl:template>

    <xsl:template match="value">
        <td><xsl:value-of select="."/></td>
    </xsl:template>

</xsl:stylesheet>

这就是它的工作原理:

处理器将读取模板中的每个节点。从根开始(它有一个隐式模板),它将处理每个节点,如果有匹配的模板,它将根据模板变换节点

如果模板中有
元素,则该模板可以允许对其他节点进行递归处理。因此,处理器找到
数据集
,将其与第一个模板匹配,添加
元素,并在表中将处理器发送到下一个模板。它将处理
元数据
并完成该子树,然后它将处理
数据
。由于
data
没有显式匹配模板,因此它再次使用默认的隐式模板,该模板匹配没有显式模板的每个可访问节点。该模板允许处理树的其余部分,即
,其中包含
应用模板
,以及


模板经过多次处理以呈现生成的HTML。

我尝试了您的代码,但为什么所有标记都消失了?如果您尝试使用发布的源XML代码,它将生成您所期望的内容。如果它不起作用,可能是源代码发生了变化。在这种情况下,您需要调整它,因为XSL取决于源结构。对不起,这是我的错。我发现在将名称空间从xmlns:xs=“更改为xmlns=”后,转换失败。这与转换无关。如果它是标准的模式实例声明,那么它应该是
www.w3.org
而不是
cognos.org
。如果需要在代码中使用四个模式实例属性之一(如
type
),则可以声明模式实例名称空间,并且应该使用前缀(通常是
xsi
)。如果声明了一个模式实例名称空间,那么还需要一个XML模式名称空间(通常带有
xs
前缀),因为如果没有它,四个属性中的任何一个实际上都是无用的。但这是另一个问题。不要使用没有前缀的名称空间。