1

我正在尝试使用我自己编写的 VB 中的脚本从我从休息调用中收到的 XML 文件进行简单的 XSL 转换。这是我收到的 XML(清理后):

 <?xml version="1.0" encoding="utf-8"?>
    <result xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.teradp.com/schemas/GN4/1/Results.xsd">
        <objsListResult>
            <obj id="4" descName="Administrator user" />
            <obj id="5" descName="Guest" />
            <obj id="1608" descName="MashupUser" />
            <obj id="1610" descName="ServiceUser" />
            <obj id="2209" descName="Brenda Perez Lastra" />
        </objsListResult>
    </result>

这是我为它编写的简单 XSL 文件:

<?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>
    <h2>GN4 User Information</h2>
    <table border="1">
      <tr bgcolor="#9acd32">
        <th>Obj ID</th>
        <th>User Complete Name</th>
      </tr>
      <tr>
        <td> <xsl:value-of select="obj/@id"/></td>
        <td> Some Text </td>
      </tr>
    </table>
  </body>
  </html>
</xsl:template>
</xsl:stylesheet>

XSLT 生成的 HTML 代码显示了表格,您可以看到上面写有“一些文本”的单元格(正如我在 XSL 代码中指定的那样),但是当打印“id”属性的内容时,我什么也没有收到。我用 Xpath 玩了一下,以为我在路径上做错了什么,但我总是什么也没收到!

4

1 回答 1

2

你有几个问题:

  1. 您实际上并没有将模板应用于obj(我假设)您想要迭代的节点。
  2. 您的输入文档有一个默认的命名空间 URI。这是开始使用 XSLT 时非常常见的问题。

我已对以下转换进行了注释,以帮助阐明与您的原始内容相比的更改。

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
                            xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                            xmlns:gn="http://www.teradp.com/schemas/GN4/1/Results.xsd">

  <!-- Note that you need to match the namespace of the nodes in the input
         document.  This namespace is declared above, and needs to be used with
         each element in an XPath expression where you expect to match a node with
         that namespace URI. -->
  <xsl:template match="/gn:result">
    <html>
        <body>
            <h2>GN4 User Information</h2>
            <table border="1">
                <tr bgcolor="#9acd32">
                    <th>Obj ID</th>
                    <th>User Complete Name</th>
                </tr>

                <!-- Right now the context node is the root "gn:result" element
                         (because that's what this template matched).  From here, apply
                         the row template on the "gn:obj" elements.  Everything else in
                         this template is essentially static content. -->
                <xsl:apply-templates select="gn:objsListResult/gn:obj" />
            </table>
        </body>
    </html>
  </xsl:template>

  <!-- When this template is called, it will be executed once for each gn:obj
         element that matches. -->
  <xsl:template match="gn:obj">
    <tr>
        <!-- Attributes don't need to be namespaced. -->
        <td> <xsl:value-of select="@id"/></td>
        <td> Some Text </td>
    </tr>
  </xsl:template>

</xsl:stylesheet>

应用于您的输入,它会产生以下输出(为清楚起见,缩进):

<html xmlns:gn="http://www.teradp.com/schemas/GN4/1/Results.xsd">
    <body>
        <h2>GN4 User Information</h2>
        <table border="1">
            <tr bgcolor="#9acd32">
                <th>Obj ID</th>
                <th>User Complete Name</th>
            </tr>
            <tr>
                <td>4</td>
                <td> Some Text </td>
            </tr>
            <tr>
                <td>5</td>
                <td> Some Text </td>
            </tr>
            <tr>
                <td>1608</td>
                <td> Some Text </td>
            </tr>
            <tr>
                <td>1610</td>
                <td> Some Text </td>
            </tr>
            <tr>
                <td>2209</td>
                <td> Some Text </td>
            </tr>
        </table>
    </body>
</html>

我想这就是你想要的。

于 2013-09-11T23:54:56.067 回答