我开始使用XSLT并尝试解决以下问题:
这是我的XML代码:
<?xml version="1.0" encoding="UTF-8"?>
<ns0:MT_SOURCE xmlns:ns0="urn:test:xslt:chris">
<FirstName>Chris</FirstName>
<LastName>Rock</LastName>
<Address>
<Street>Musterstr.</Street>
<StreetNumber>2</StreetNumber>
<PostalCode>12345</PostalCode>
<City>Stadt</City>
<Country>Deutschland</Country>
</Address>
</ns0:MT_SOURCE>
现在我想将其转换为另一种结构,我将国家/地区值映射到代码。 我静静地按照以下方式工作:
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:a="urn:test:xslt:chris">
<xsl:variable name="map">
<map>
<entry from="Deutschland">DE</entry>
<entry from="England">EN</entry>
<entry from="USA">US</entry>
</map>
</xsl:variable>
<xsl:template match="/">
<a:MT_TARGET>
<NAME>
<xsl:value-of select="concat(concat(a:MT_SOURCE/FirstName,' '),a:MT_SOURCE/LastName)"/>
</NAME>
<COUNTRYCODE>
<xsl:value-of select="document('')//xsl:variable[@name='map']/map/entry[@from='England']"/>
</COUNTRYCODE>
<CITY>
<xsl:value-of select="a:MT_SOURCE/Address/City"/>
</CITY>
<POSTALCODE>
<xsl:value-of select="a:MT_SOURCE/Address/PostalCode"/>
</POSTALCODE>
<STREET>
<xsl:value-of select="concat(a:MT_SOURCE/Address/Street,a:MT_SOURCE/Address/StreetNumber)"/>
</STREET>
</a:MT_TARGET>
</xsl:template>
</xsl:stylesheet>
现在重要的部分是以下几行:
<COUNTRYCODE>
<xsl:value-of select="document('')//xsl:variable[@name='map']/map/entry[@from='England']"/>
</COUNTRYCODE>
静态地这是有效的,所以我在国家代码输出中得到EN而不是英格兰。但我宁愿需要的是对Country字段进行评估,并从映射表中获取属于它的正确值。
您能否告诉我如何修改我的代码以使其正常工作? 我尝试使用current()但似乎没有做任何事情。
答案 0 :(得分:1)
只需将重要部分改为
即可<COUNTRYCODE>
<xsl:value-of select="document('')//xsl:variable[@name='map']/map/entry[@from=current()/a:MT_SOURCE/Address/Country]"/>
</COUNTRYCODE>
这样current()正在运行。
答案 1 :(得分:0)
这是一种方法。确保正确使用current()
。
另外,我简化了你的样式表:
map
元素。另请注意,在XML输入和XSLT样式表中使用具有不同前缀的相同名称空间令人困惑。始终使用相同的前缀来表示相同的名称空间。
整个样式表:
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:a="urn:test:xslt:chris">
<xsl:output method="xml" indent="yes"/>
<xsl:variable name="map">
<entry from="Deutschland">DE</entry>
<entry from="England">EN</entry>
<entry from="USA">US</entry>
</xsl:variable>
<xsl:template match="/a:MT_SOURCE">
<a:MT_TARGET>
<NAME>
<xsl:value-of select="concat(concat(FirstName,' '),LastName)"/>
</NAME>
<COUNTRYCODE>
<xsl:value-of select="document('')//xsl:variable[@name='map']/entry[@from=current()/Address/Country]"/>
</COUNTRYCODE>
<CITY>
<xsl:value-of select="Address/City"/>
</CITY>
<POSTALCODE>
<xsl:value-of select="Address/PostalCode"/>
</POSTALCODE>
<STREET>
<xsl:value-of select="concat(Address/Street,Address/StreetNumber)"/>
</STREET>
</a:MT_TARGET>
</xsl:template>
</xsl:stylesheet>