Xml XSLT 1.0映射检查当前节点
我从XSLT开始,试图解决以下问题: 这是我的XML代码:Xml XSLT 1.0映射检查当前节点,xml,xslt,Xml,Xslt,我从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&
<?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>
克里斯
摇滚乐
Musterstr。
2.
12345
斯塔特
德国
现在,我想将其转换为另一个结构,在该结构中,我将国家值映射为代码。
静态上,我让它以以下方式工作:
<?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>
判定元件
EN
美国
现在最重要的部分是以下几行:
<COUNTRYCODE>
<xsl:value-of select="document('')//xsl:variable[@name='map']/map/entry[@from='England']"/>
</COUNTRYCODE>
静态上这是可行的,所以我在countrycode输出中得到的是EN而不是England。但我更愿意需要的是对Country字段进行评估,并从映射表中获取属于它的正确值
你能告诉我如何修改我的代码以使其正常工作吗?
我尝试使用current(),但它似乎没有任何作用。只需将重要部分更改为
<COUNTRYCODE>
<xsl:value-of select="document('')//xsl:variable[@name='map']/map/entry[@from=current()/a:MT_SOURCE/Address/Country]"/>
</COUNTRYCODE>
这样current()就起作用了。只要把重要的部分改成
<COUNTRYCODE>
<xsl:value-of select="document('')//xsl:variable[@name='map']/map/entry[@from=current()/a:MT_SOURCE/Address/Country]"/>
</COUNTRYCODE>
这是current()的工作方式。这是一种工作方式。确保正确使用
current()
此外,我简化了您的样式表:
<?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>
- 删除了所创建变量中的冗余嵌套
元素map
- 如您所见,让模板匹配“/a:MT_SOURCE”大大简化了XSLT代码
- 如果将输出方法设置为XML并缩进,这将提高输出的可读性,因为您仍然在输出XML元素
<?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>
判定元件
EN
美国
这是一种方法。确保正确使用current()
此外,我简化了您的样式表:
<?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>
- 删除了所创建变量中的冗余嵌套
元素map
- 如您所见,让模板匹配“/a:MT_SOURCE”大大简化了XSLT代码
- 如果将输出方法设置为XML并缩进,这将提高输出的可读性,因为您仍然在输出XML元素
<?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>
判定元件
EN
美国
非常感谢,我的例子就是这样。我尝试了from=current()和from=a:MT_SOURCE/Address/Country,但两者都不起作用。你能解释为什么仅仅说from=a:MT_来源/地址/国家是不够的吗?另外,如果我的元素是1:n而不是1:1,我如何增强这一点呢?document()函数允许您查询另一个XML文档。要切换回当前上下文,请使用current()。在这两种情况下,不仅需要更改文档,还需要处理查询。如果未找到匹配的数据,则返回空节点集,且不显示错误消息。在您的情况下,实际文档与您使用的空文档(“”)相同可能会令人困惑。非常感谢,我的示例就是这样。我尝试了from=current()和from=a:MT_SOURCE/Address/Country,但两者都不起作用。你能解释为什么仅仅说from=a:MT_来源/地址/国家是不够的吗?另外,如果我的元素是1:n而不是1:1,我如何增强这一点呢?document()函数允许您查询另一个XML文档。要切换回当前上下文,请使用current()。在这两种情况下,不仅需要更改文档,还需要处理查询。如果未找到匹配的数据,则返回空节点集,且不显示错误消息。在您的情况下,实际文档与您正在使用的空文档(“”)相同可能会令人困惑。