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
如何使用XSLT2.0检索xml的命名空间 XML: 第一要素 第二要素 第三代 这是最后一个元素 XSLT:_Xml_Xslt_Xslt 2.0_Xml Namespaces - Fatal编程技术网

如何使用XSLT2.0检索xml的命名空间 XML: 第一要素 第二要素 第三代 这是最后一个元素 XSLT:

如何使用XSLT2.0检索xml的命名空间 XML: 第一要素 第二要素 第三代 这是最后一个元素 XSLT:,xml,xslt,xslt-2.0,xml-namespaces,Xml,Xslt,Xslt 2.0,Xml Namespaces,当输入XML具有不同的命名空间时,上述XSLT将失败。因此,我需要一个XSLT,它将从输入XML动态获取名称空间并进行转换。请给我建议正确的解决方案 需要在要求中进一步澄清,请评论。提前谢谢 关于这一点,Mani。您可以尝试以下方法 <?xml version=1.0 encoding=UTF-8?> <xsl:stylesheet xmlns:cs="https://defaultnamespace/abc"> <xsl:output method="xml" v

当输入XML具有不同的命名空间时,上述XSLT将失败。因此,我需要一个XSLT,它将从输入XML动态获取名称空间并进行转换。请给我建议正确的解决方案

需要在要求中进一步澄清,请评论。提前谢谢


关于这一点,Mani。

您可以尝试以下方法

<?xml version=1.0 encoding=UTF-8?>
<xsl:stylesheet xmlns:cs="https://defaultnamespace/abc">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:template match="/">
<xsl:for-each select="/cs:Report/cs:Conversion/cs:Type">
<xsl:element name="Converting"><xsl:value-of select="."/></xsl:element>
</xsl:for-each>
<xsl:element name="LastOne"><xsl:value-of select="/cs:Report/cs:Last"/>                  </xsl:element>
</xsl:template>
</xsl:stylesheet>

如果有一些选项,可以使用通配符

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:cs1="https://defaultnamespace/abc" xmlns:cs2="https://defaultnamespace1/abc" exclude-result-prefixes="cs1 cs2">
  <xsl:template match="/">
      <xsl:apply-templates/>
  </xsl:template>

  <xsl:template match="cs1:Report">
    <xsl:for-each select="cs1:Conversion/cs1:Type">
      <xsl:element name="Converting">
        <xsl:value-of select="."/>
      </xsl:element>
    </xsl:for-each>
    <xsl:element name="LastOne">
      <xsl:value-of select="cs1:Last"/>
    </xsl:element>
  </xsl:template>

  <xsl:template match="cs2:Report">
    <xsl:for-each select="cs2:Conversion/cs2:Type">
      <xsl:element name="Converting">
        <xsl:value-of select="."/>
      </xsl:element>
    </xsl:for-each>
    <xsl:element name="LastOne">
      <xsl:value-of select="cs2:Last"/>
    </xsl:element>
  </xsl:template>
</xsl:stylesheet>

或者您可以简单地声明两个名称空间

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:template match="/">
<xsl:for-each select="/*:Report/*:Conversion/*:Type">
<xsl:element name="Converting"><xsl:value-of select="."/></xsl:element>
</xsl:for-each>
<xsl:element name="LastOne"><xsl:value-of select="/*:Report/*:Last"/>                  </xsl:element>
</xsl:template>
</xsl:stylesheet>

当您希望样式表在两个(或多个)/不同的名称空间中对源XML进行操作时,我的首选解决方案是运行一个管道,首先将XML转换为单个“规范化”名称空间,然后正确地进行转换。正常化阶段,假设不需要对内容进行任何更改,可以这样做:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:pf1="http://example.com/ns1" xmlns:pf2="http://example.com/ns2">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:template match="/">
<xsl:for-each select="/pf1:Report/pf1:Conversion/pf1:Type | /pf2:Report/pf2:Conversion/pf2:Type">
<xsl:element name="Converting"><xsl:value-of select="."/></xsl:element>
</xsl:for-each>
<xsl:element name="LastOne"><xsl:value-of select="/pf1:Report/pf1:Last | /pf2:Report/pf2:Last"/>                  </xsl:element>
</xsl:template>
</xsl:stylesheet>


是否有输入XML可以拥有的已知名称空间列表?--另外,名称空间会改变,但结构却不会改变,这似乎很奇怪P.P.S这不是一个有效的样式表。@michael.hor257k Yess michael,我们有一个场景,输入XML可能有这两个名称空间(1,2.)中的一个名称空间。XML的结构是相同的。我已经修改了XSLT。现在请帮帮我。
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:pf1="http://example.com/ns1" xmlns:pf2="http://example.com/ns2">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:template match="/">
<xsl:for-each select="/pf1:Report/pf1:Conversion/pf1:Type | /pf2:Report/pf2:Conversion/pf2:Type">
<xsl:element name="Converting"><xsl:value-of select="."/></xsl:element>
</xsl:for-each>
<xsl:element name="LastOne"><xsl:value-of select="/pf1:Report/pf1:Last | /pf2:Report/pf2:Last"/>                  </xsl:element>
</xsl:template>
</xsl:stylesheet>
<xsl:template match="node()">
  <xsl:element name="{local-name()}" namespace="http://normalized.namespace/">
    <xsl:copy-of select="@*"/>
    <xsl:apply-templates/>
  </xsl:element>
</xsl:template>