2013-12-11 91 views
1

我用XSLT开始,我试图解决以下问题:XSLT 1.0映射检查当前节点

这是我的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> 

静态这是工作,所以我在COUNTRYCODE输出越来越EN而不是英格兰。但是我想要的是国家字段被评估,并且从映射表中正确的价值取决于它属于它。

你能否给我如何修改我的代码,以使其工作? 我尝试使用current(),但它似乎没有做任何事情。

回答

1

只要改变重要组成部分,为

<COUNTRYCODE> 
    <xsl:value-of select="document('')//xsl:variable[@name='map']/map/entry[@from=current()/a:MT_SOURCE/Address/Country]"/> 
</COUNTRYCODE> 

这样电流()工作。

+0

非常感谢你,这适用于我的例子。我尝试从=当前()和从= a:MT_SOURCE /地址/国家,但都没有工作。你能解释为什么它不足以从= a:MT_SOURCE /地址/国家说出吗?另外我怎么能加强这一点的情况下,我的

元素将是1:n而不是1:1? – user3091422

+0

document()函数允许您查询另一个XML文档。要切换回当前上下文,将使用current()。在这两种情况下,不仅需要更改文档,还需要解决查询问题。如果找不到匹配的数据,则返回一个空节点集合,但不会出现错误消息。在你的情况下,可能会令人困惑的是,实际文档与使用空文档('')相同。 – Andreas

0

这是一种方法。确保正确使用current()

另外,我简化您的样式表:

  • 删除在您创建变量冗余的嵌套map元素。
  • 让模板匹配“/一: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> 
+0

你是对的伊恩,我的坏。我将调整样式表。 –