我正在使用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)))))'.
答案 0 :(得分:2)
如果我的理解是正确的,
<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
@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>
答案 1 :(得分:0)
使用您的特定XSLT引擎要求如果输出方法是HTML,则必须只有一个输出根元素。
我的解决方案(未经测试)是对Siva的调整。我刚刚确保了单根元素输出。
<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>