0

XSLT を使用して XML を HTML に変換しています。現在、XSLT で配列変数を作成する方法を見つけようとしています。

これは私の XML です:

<data>
    <ACCOUNTS elem="0">
        <ACCOUNT_NO>12345</ACCOUNT_NO>
    </ACCOUNTS>
    <ACCOUNTS elem="1">
        <ACCOUNT_NO>67890</ACCOUNT_NO>
    </ACCOUNTS>
</data>

これは、私が理解しようとしているが機能していない私の XSLT です。

<xsl:variable name="accounts">
    <xsl:for-each select="data/ACCOUNTS">
        <child elem="<xsl:value-of select='position()' />"><xsl:value-of select="ACCOUNT_NO" /></child>
    </xsl:for-each>
</xsl:variable>

を使用して表示できるように、XML ノードに位置を追加するにはどうすればよいですか?

<xsl:value-of select="$account[@elem=1]" />

私を助けてください。懸念がある場合はお知らせください。ありがとう。

更新しました :

私の完全な XSLT コード:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" encoding="utf-8" indent="yes"/>

<xsl:variable name="accounts">
    <xsl:for-each select="data/ACCOUNTS">
        <child elem="{@elem}"><xsl:value-of select="ACCOUNT_NO" /></child>
    </xsl:for-each>
</xsl:variable>

<xsl:template match="/">
    <html>
        <head><title>testing</title></head>
        <body>
            <xsl:value-of select="$accounts/child[@elem='0']" />
        </body>
    </html>
</xsl:template>
</xsl:stylesheet>

そして、私がコンパイルすると、このエラーが発生します:

JAXPSAXProcessorInvoker  - Error checking type of the expression 'FilterParentPath(variable-ref(accounts/result-tree), step("child", 40, pred(=(step("attribute", 18), literal-expr(0)))))'.
4

2 に答える 2

2

私の理解が正しければ、

入力 XML:

<data>
    <ACCOUNTS elem="0">
        <ACCOUNT_NO>12345</ACCOUNT_NO>
    </ACCOUNTS>
    <ACCOUNTS elem="1">
        <ACCOUNT_NO>67890</ACCOUNT_NO>
    </ACCOUNTS>
</data>

XSLT:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="html"/>
    <xsl:template match="/">
        <xsl:for-each select="data/ACCOUNTS">
            <child elem="{@elem}">
                <xsl:value-of select="ACCOUNT_NO"/>
            </child>
        </xsl:for-each>
    </xsl:template>
</xsl:stylesheet>

出力 HTML:

<child elem="0">12345</child>
<child elem="1">67890</child>

別の XSLT:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="html"/>
    <xsl:template match="/">
        <xsl:variable name="accounts">
            <xsl:for-each select="data/ACCOUNTS">
                <child elem="{@elem}">
                    <xsl:value-of select="ACCOUNT_NO"/>
                </child>
            </xsl:for-each>
        </xsl:variable>
        <xsl:value-of select="$accounts/child[@elem='1']"/>
    </xsl:template>
</xsl:stylesheet>

出力:

67890

更新しました:

@Kelvingo: 更新された XSLT によると、これを使用するにはmsxsl:node-setが必要になると思います

<xsl:value-of select="msxsl:node-set($accounts)/child[@elem='0']"/>

アカウント変数。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt">
    <xsl:output method="html" encoding="utf-8" indent="yes"/>
    <xsl:variable name="accounts">
        <xsl:for-each select="data/ACCOUNTS">
            <child elem="{@elem}">
                <xsl:value-of select="ACCOUNT_NO"/>
            </child>
        </xsl:for-each>
    </xsl:variable>
    <xsl:template match="/">
        <html>
            <head>
                <title>testing</title>
            </head>
            <body>
                <xsl:value-of select="msxsl:node-set($accounts)/child[@elem='0']"/>
            </body>
        </html>
    </xsl:template>
</xsl:stylesheet>
于 2012-05-30T07:50:32.757 に答える
0

特定の XSLT エンジンでは、出力メソッドが HTML の場合、正確に 1 つの出力ルート要素が必要であるという要件があります。

私の解決策 (テストされていません) は、Siva の微調整です。ルート要素が 1 つの出力であることを確認しました。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="html"/>
    <xsl:template match="/">
       <html> 
        <xsl:for-each select="data/ACCOUNTS">
            <child elem="{@elem}">
                <xsl:value-of select="ACCOUNT_NO"/>
            </child>
        </xsl:for-each>
      </html>
    </xsl:template>
</xsl:stylesheet>
于 2012-05-30T09:13:17.153 に答える