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源且默认命名空间设置为xmlns的XSLT_Xslt_Namespaces - Fatal编程技术网

具有XML源且默认命名空间设置为xmlns的XSLT

具有XML源且默认命名空间设置为xmlns的XSLT,xslt,namespaces,Xslt,Namespaces,我有一个XML文档,在根目录下有一个默认名称空间。 大概是这样的: <MyRoot xmlns="http://www.mysite.com"> <MyChild1> <MyData>1234</MyData> </MyChild1> </MyRoot> 1234 用于解析XML的XSLT无法按预期工作,因为 默认名称空间,即当我删除名称空间时,所有内容都按 预料之中 这是我的XSLT:

我有一个XML文档,在根目录下有一个默认名称空间。 大概是这样的:

<MyRoot xmlns="http://www.mysite.com">
   <MyChild1>
       <MyData>1234</MyData> 
   </MyChild1> 
</MyRoot>

1234
用于解析XML的XSLT无法按预期工作,因为 默认名称空间,即当我删除名称空间时,所有内容都按 预料之中

这是我的XSLT:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
            xmlns:xs="http://www.w3.org/2001/XMLSchema">
 <xsl:template match="/" >
  <soap:Envelope xsl:version="1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
   <soap:Body>
     <NewRoot xmlns="http://wherever.com">
       <NewChild>
         <ChildID>ABCD</ChildID>
         <ChildData>
            <xsl:value-of select="/MyRoot/MyChild1/MyData"/>
         </ChildData>
       </NewChild>
     </NewRoot>
   </soap:Body>
  </soap:Envelope>
 </xsl:template>
</xsl:stylesheet>

ABCD

为了使翻译正常工作,需要对XSLT文档做些什么?在XSLT文档中到底需要做什么?

您需要在XSLT中声明名称空间,并在XPath表达式中使用它。例如:

<xsl:stylesheet ... xmlns:my="http://www.mysite.com">

   <xsl:template match="/my:MyRoot"> ... </xsl:template>

</xsl:stylesheet>

... 

请注意,如果要在XPath中引用来自该命名空间的元素,必须提供一些前缀。虽然您可以不使用前缀而直接执行
xmlns=“…”
,并且它可以用于文本结果元素,但对XPath不起作用-在XPath中,不固定的名称始终被视为位于URI为空的命名空间中,而不管范围中有任何
xmlns=“…”

您需要在XSLT中声明命名空间,并在XPath表达式中使用它。例如:

<xsl:stylesheet ... xmlns:my="http://www.mysite.com">

   <xsl:template match="/my:MyRoot"> ... </xsl:template>

</xsl:stylesheet>

... 

请注意,如果要在XPath中引用来自该命名空间的元素,必须提供一些前缀。虽然您可以不使用前缀而直接执行
xmlns=“…”
,并且它可以用于文本结果元素,但对XPath不起作用-在XPath中,无论作用域中有任何
xmlns=“…”
,非固定名称始终被认为位于URI为空的命名空间中。

如果使用XSLT 2.0,请指定
XPath默认命名空间="http://www.example.com
样式表
部分。

如果使用XSLT 2.0,请指定
xpath默认名称空间=http://www.example.com“
样式表
部分。

如果这是一种名称空间问题,可以尝试修改xslt文件中的两个内容:

  • 在xsl:stylesheet标记中添加“我的”名称空间定义
  • 在遍历xml文件时调用元素时使用“my:”前缀
结果

ABCD

如果这是一种名称空间问题,那么可以尝试修改xslt文件中的两项内容:

  • 在xsl:stylesheet标记中添加“我的”名称空间定义
  • 在遍历xml文件时调用元素时使用“my:”前缀
结果

ABCD

谢谢您的回答。它与我在internet上找到的类似,但不起作用。我的XML输出仍然不能按预期工作。如果我从源XML中删除默认名称空间,则输出XML看起来很好。如果有区别,我的XSLT翻译应用程序是.NET 2.0应用程序。请显示您的XLST那就不行了。如果不看它,很难说得更明确。你描述的内容听起来仍然像是遗漏了名称空间限定符somwhere。例如,请记住,你必须在每个XPath步骤中重复它-例如,
/my:MyRoot/my:foo/my:bar
。关于需要前缀的非常有用的说明。这触发了我的检查规范。看起来,如果存在默认名称空间,XPath将尊重默认名称空间,但是XSLT明确地将默认名称空间排除在@PavelMinaev范围之外:我在XPath中使用了
/my:MyRoot
,因此我的模板匹配看起来如下:
-那么MyRoot是什么-这是XSLT中的保留名称吗?不,它只是一个元素名称。您应该为您的XML使用最外层元素的名称。谢谢您的回答。它与我在internet中找到的内容类似,但不起作用。我的XML输出仍然不能按预期工作。如果我从源XML中删除默认名称空间,则输出XML看起来很好。我的XSLT转换应用程序是一个.NET 2.0应用程序,如果有区别的话。那么,请显示您的XLST不起作用。如果没有看到它,很难说得更明确。您描述的内容听起来仍然像是遗漏了名称空间限定符。例如,请记住,您必须在每个XPath步骤中重复它-例如,
/my:MyRoot/my:foo/my:bar
。关于需要前缀的非常有用的说明。这促使我检查规范。看起来,如果存在默认名称空间,XPath将尊重默认名称空间,但XSLT明确将默认名称空间排除在@PavelMinaev:scope中,我在我的XPath中使用了
/my:MyRoot
,因此我的模板匹配如下所示:
-soMyRoot是什么?这是XSLT中的保留名称吗?不,它只是一个元素名称。您应该在XML中使用最外层元素的名称。Zhang Zhang Zhang Zhang Zhang Zhang Zhang Zhang Zhang Zhang Zhang Zhang Zhang Zhang Zhang Zhang Zhang Zhang Zhang Zhang Zhang Zhang Zhang Zhang Zhang Zhang Zhang Zhang Zhang Zhang Zhang Z。