Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml XSLT 1.0映射检查当前节点_Xml_Xslt - Fatal编程技术网

Xml XSLT 1.0映射检查当前节点

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&

我从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>

克里斯
摇滚乐
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输入和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>

判定元件
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输入和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>

判定元件
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()。在这两种情况下,不仅需要更改文档,还需要处理查询。如果未找到匹配的数据,则返回空节点集,且不显示错误消息。在您的情况下,实际文档与您正在使用的空文档(“”)相同可能会令人困惑。