【问题标题】:XSLT 1.0 Mapping checking the current nodeXSLT 1.0 映射检查当前节点
【发布时间】:2013-12-11 14:47:56
【问题描述】:

我从 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 而不是 England。但我宁愿需要的是对 Country 字段进行评估,并且从映射表中获取属于它的正确值。

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

【问题讨论】:

    标签: xml xslt


    【解决方案1】:

    把重要的部分改成

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

    这种方式 current() 正在工作。

    【讨论】:

    • 非常感谢,这适用于我的示例。我尝试了 from = current() 和 from = a:MT_SOURCE/Address/Country ,但都没有奏效。你能解释一下为什么说 from = a:MT_SOURCE/Address/Country 是不够的吗?另外,对于我的
      元素是 1:n 而不是 1:1 的情况,我该如何增强它?
    • document() 函数允许您查询另一个 XML 文档。使用 current() 切换回当前上下文。在这两种情况下,不仅需要更改文档,还需要处理查询。如果没有找到匹配的数据,则返回一个空节点集而没有错误消息。在您的情况下,实际文档与您使用的空文档('')相同可能会令人困惑。
    【解决方案2】:

    这是一种方法。确保您正确使用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>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-03
      相关资源
      最近更新 更多