在尝试创建对外部xml文件的交叉引用以使用xslt替换原始xml中的值时,我遇到了一个没有返回任何内容的问题。
这是标题为" codes.xml"
的外部文件<?xml version="1.0" encoding="utf-8"?>
<codes>
<paymentmethodcode>
<code id="CHK" desc="Check"/>
<code id="ACH" desc="Automated Clearing House" />
<code id="BOP" desc="Financial Institution Option" />
<code id="FWT" desc="Federal Reserve Funds" />
<code id="NON" desc="Non Payment Data" />
</paymentmethodcode>
</codes>
这是样式表的顶部:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="html" doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN" doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd" encoding="UTF-8" indent="yes" omit-xml-declaration="yes" />
<xsl:param name="lookup" select="'codes.xml'" />
<xsl:variable name="lookupDoc" select="document($lookup)" />
<xsl:key name='paymentmethodcode' match='lu:codes/paymentmethodcode/code' use='@id' />
在模板中,我尝试检索&#39; desc&#39;代码的属性,但在&#34; normalize-space()&#34;之前没有返回任何内容。功能被应用:
<xsl:template match ="FunctionGroup/Transaction">
<div class="infoLeft">
<p><label>Filename:</label></p>
<p><label>Pay Method:</label>
<xsl:variable name="paymethodvalue" select="normalize-space(BPR/BPR04)" />
<xsl:for-each select="$lookupDoc">
<xsl:variable name="value" select="key('paymentmethodcode', $paymethodvalue)" />
<xsl:value-of select="$value/@desc"/>
</xsl:for-each></p>
</div>
</xsl:template>
其余的:
<xsl:template match="*">
<html lang="en" xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>EDI</title>
</head>
<body>
<xsl:apply-templates select="FunctionGroup/Transaction" />
</body>
</html>
</xsl:template>
以下是输入文件的最小化版本:
<?xml version="1.0"?>
<FunctionGroup>
<Transaction>
<BPR>
<BPR04>
CHK
</BPR04>
</BPR>
</Transaction>
</FunctionGroup>
答案 0 :(得分:1)
xsl:for-each select="$lookupDoc/paymentmethodcode/code"
, match
看起来不对,我认为您只需要xsl:for-each select="$lookupDoc"
将上下文更改为基于key
的查找的外部文档。如果该更改不足以使其工作,那么向我们展示输入XML,XSLT和查找文档中使用的命名空间的所有细节。
我试图用你的代码重现问题,XSLT是
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" xmlns:lu="http://example.com/lookup">
<xsl:output method="html" doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN" doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd" encoding="UTF-8" indent="yes" omit-xml-declaration="yes" />
<xsl:param name="lookup" select="'test2014081201.xml'" />
<xsl:variable name="lookupDoc" select="document($lookup)" />
<xsl:key name='paymentmethodcode' match='lu:codes/paymentmethodcode/code' use='@id' />
<xsl:template match ="FunctionGroup/Transaction">
<div class="infoLeft">
<p><label>Filename:</label></p>
<p><label>Pay Method:</label>
<xsl:for-each select="$lookupDoc">
<xsl:variable name="value" select="key('paymentmethodcode', 'CHK')" />
<xsl:value-of select="$value/@desc"/>
</xsl:for-each></p>
</div>
</xsl:template>
</xsl:stylesheet>
XML输入只是
<FunctionGroup>
<Transaction>foo</Transaction>
</FunctionGroup>
查找文档已发布,然后Saxon 6.5提供结果
<!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<div xmlns:lu="http://example.com/lookup" class="infoLeft">
<p><label>Filename:</label></p>
<p><label>Pay Method:</label>Check
</p>
</div>
所以&#34;检查&#34;找到了价值。
答案 1 :(得分:1)
我们没有看到您的输入XML,因此我们不知道模板是否与任何内容匹配。我建议你尝试以下测试样式表(带任何输入):
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:param name="lookup" select="'codes.xml'" />
<xsl:variable name="lookupDoc" select="document($lookup)" />
<xsl:key name="paymentmethodcode" match="code" use='@id' />
<xsl:template match="/">
<xsl:for-each select="$lookupDoc">
<result>
<xsl:value-of select="key('paymentmethodcode', 'CHK')/@desc"/>
</result>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
应该返回;
<?xml version="1.0" encoding="UTF-8"?>
<result>Check</result>
请注意,没有必要引用lu:前缀或其关联的命名空间。
变化:
<xsl:variable name="paymethodvalue" select="BPR/BPR04" />
为:
<xsl:variable name="paymethodvalue" select="normalize-space(BPR/BPR04)" />
或者在调用key()函数时应用normalize-space()函数,即:
<xsl:value-of select="key('paymentmethodcode', normalize-space($paymethodvalue))/@desc"/>