XSLT如何从XML生成动态变量数组?
我正在使用XSLT将XML转换为HTML。目前,我正试图弄清楚如何在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>
<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>