XSLT 1.0映射检查当前节点

时间:2013-12-11 14:47:56

标签: 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>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()但似乎没有做任何事情。

2 个答案:

答案 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元素。
  • 让模板匹配“/ a:MT_SOURCE”大大简化了XSLT代码,如您所见
  • 如果将输出方法设置为XML并缩进,则会提高输出的可读性,因为无论如何都在输出XML元素

另请注意,在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>