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_Xml_Xslt_Xml Namespaces - Fatal编程技术网

Xml 具有多个名称空间的XSLT

Xml 具有多个名称空间的XSLT,xml,xslt,xml-namespaces,Xml,Xslt,Xml Namespaces,我对样式表很陌生,所以我有一些基本的问题 以下是我的XML: <NS1:Envelope xmlns:NS1="http://blahblahblah"> <NS1:Body> <NS2:STR xmlns:NS2="http://blahblah"> <NS2:STD> <NS2:ST>CA</NS2:ST> <NS2:CTY>L

我对样式表很陌生,所以我有一些基本的问题

以下是我的XML:

<NS1:Envelope xmlns:NS1="http://blahblahblah">


<NS1:Body>
      <NS2:STR xmlns:NS2="http://blahblah">
         <NS2:STD>
            <NS2:ST>CA</NS2:ST>
            <NS2:CTY>Los Angeles</NS2:CTY>
            <NS2:CY>Artesia</NS2:CY>
            <NS2:STGC>05</NS2:STGC>
            <NS2:CTYGC>037</NS2:CTYGC>
            <NS2:CYGC>0160</NS2:CYGC>
            <NS2:GC>050370160</NS2:GC>
            <NS2:STTR>0.065000</NS2:STTR>
            <NS2:CTYTR>0.025000</NS2:CTYTR>
            <NS2:CYTR>0.000000</NS2:CYTR>
            <NS2:TotalTR>0.090000</NS2:TotalTR>
            <NS2:EffectiveDate>2014-09-24</NS2:EffectiveDate>
         </NS2:STD>
         <NS2:STD>
            <NS2:ST>CA</NS2:ST>
            <NS2:CTY>Los Angeles</NS2:CTY>
            <NS2:CY>Cerritos</NS2:CY>
            <NS2:STGC>05</NS2:STGC>
            <NS2:CTYGC>037</NS2:CTYGC>
            <NS2:CYGC>6430</NS2:CYGC>
            <NS2:GC>050370160</NS2:GC>
            <NS2:STTR>0.065000</NS2:STTR>
            <NS2:CTYTR>0.025000</NS2:CTYTR>
            <NS2:CYTR>0.000000</NS2:CYTR>
            <NS2:TotalTR>0.090000</NS2:TotalTR>
            <NS2:EffectiveDate>2014-09-24</NS2:EffectiveDate>
         </NS2:STD>
      </NS2:STR>
   </NS1:Body>
</NS1:Envelope>

加利福尼亚州
洛杉矶
动脉
05
037
0160
050370160
0.065000
0.025000
0
0.090000
2014-09-24
加利福尼亚州
洛杉矶
塞里托斯
05
037
6430
050370160
0.065000
0.025000
0
0.090000
2014-09-24
这是我的样式表:

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:NS1="http://blahblahblah"
xmlns:NS2="http://blahblah">

<xsl:output method="xml" indent="yes"/>

<xsl:template match="/NS1:Envelope/NS1:Body/NS2:STR/NS2:STD">
  <xsl:element name="CALL_ENGINE_RESPONSE">
    <xsl:value-of select="NS2:ST" />
  </xsl:element>
</xsl:template>

</xsl:stylesheet>

我得到的答复是:

<?xml version="1.0" encoding="UTF-8"?>



         <CALL_ENGINE_RESPONSE>CA</CALL_ENGINE_RESPONSE>
         <CALL_ENGINE_RESPONSE>CA</CALL_ENGINE_RESPONSE>

加利福尼亚州
加利福尼亚州
我试图得到这样的回应

         <CALL_ENGINE_RESPONSE>
         <STATE>CA</STATE>
         <STATE>CA</STATE>
         </CALL_ENGINE_RESPONSE>

加利福尼亚州
加利福尼亚州

请让我知道我是否应该编辑我的格式,我为这么长的时间道歉。

您对名称空间的处理非常好

为了解决您的问题,您可以使用一个模板来匹配
NS2:STD
的共同祖先,并在选择
NS2:STD
元素之前在那里输出
CALL\u ENGINE\u响应

<xsl:template match="NS2:STR">
   <CALL_ENGINE_RESPONSE>
       <xsl:apply-templates select="NS2:STD" />
   </CALL_ENGINE_RESPONSE>
</xsl:template>

注意:不需要将
NS2:STD
元素的完整路径放入模板匹配中。只有当层次结构中的不同位置存在其他
NS2:STD
元素而您不想匹配时,才需要执行此操作。

谢谢Tim,请您向我解释一下排除结果前缀的作用。这意味着如果输出XML中没有使用这些名称空间声明,serialiser将不会输出这些名称空间声明。尝试从XSLT中删除该行,看看会发生什么!
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:NS1="http://blahblahblah" xmlns:NS2="http://blahblah" exclude-result-prefixes="NS1 NS2">
   <xsl:output method="xml" indent="yes"/>

   <xsl:template match="NS2:STR">
      <CALL_ENGINE_RESPONSE>
         <xsl:apply-templates select="NS2:STD"/>
      </CALL_ENGINE_RESPONSE>
   </xsl:template>

   <xsl:template match="NS2:STD">
      <STATE>
         <xsl:value-of select="NS2:ST"/>
      </STATE>
   </xsl:template>
</xsl:stylesheet>