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 コードで指定したように) "Some Text" が書かれたセルを見ることができますが、"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 に答える