Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.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_Dynamic - Fatal编程技术网

XSLT如何从XML生成动态变量数组?

XSLT如何从XML生成动态变量数组?,xml,xslt,dynamic,Xml,Xslt,Dynamic,我正在使用XSLT将XML转换为HTML。目前,我正试图弄清楚如何在XSLT中生成数组变量 这是我的XML: <data> <ACCOUNTS elem="0"> <ACCOUNT_NO>12345</ACCOUNT_NO> </ACCOUNTS> <ACCOUNTS elem="1"> <ACCOUNT_NO>67890</ACCOUNT_NO>

我正在使用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>
JAXPSAXProcessorInvoker  - Error checking type of the expression 'FilterParentPath(variable-ref(accounts/result-tree), step("child", 40, pred(=(step("attribute", 18), literal-expr(0)))))'.

如果我的理解是正确的

输入XML: 更新: @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>

测试

对于特定的XSLT引擎,有一个要求,即如果输出方法是HTML,则必须只有一个输出根元素

我的解决方案(未经测试)是对湿婆的调整。我刚刚确保了一个根元素的输出

<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>


您的目标有点不明确。您可以添加所需的html输出吗?也许有一个比您当前的方法简单得多的解决方案。我在使用Eclipse进行转换时遇到了这个错误。
JAXPSAXProcessorInvoker-表达式“FilterParentPath(变量ref(帐户/结果树))、步骤(“child”、40、pred((步骤(“属性”),18)、文本表达式(0‘‘‘)’的错误检查类型。Siva,虽然您的答案格式优美,对于兼容的XSLT引擎来说是正确的,但您已经错过了他的问题的细节。从错误消息中,他正在使用EclipseXSL插件。您的解决方案在他崩溃的XSLT引擎中无法运行。@kelvingo935:您可能需要使用
msxsl:node set
来访问变量。试试这个,我已经更新了答案。
<data>
    <ACCOUNTS elem="0">
        <ACCOUNT_NO>12345</ACCOUNT_NO>
    </ACCOUNTS>
    <ACCOUNTS elem="1">
        <ACCOUNT_NO>67890</ACCOUNT_NO>
    </ACCOUNTS>
</data>
<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>
<child elem="0">12345</child>
<child elem="1">67890</child>
<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
<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>
<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>