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_Xslt 1.0 - Fatal编程技术网

Xml 如何使用XSLT复制根节点的名称空间和属性?

Xml 如何使用XSLT复制根节点的名称空间和属性?,xml,xslt,xslt-1.0,Xml,Xslt,Xslt 1.0,我是XSL/XML新手,需要XSL转换方面的帮助 我有这样开始的XML <?xml version="1.0" encoding="UTF-8"?> <Invoice xmlns="urn:oasis:names:specification:ubl:schema:xsd:Invoice-2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:oasis:name

我是XSL/XML新手,需要XSL转换方面的帮助

我有这样开始的XML

<?xml version="1.0" encoding="UTF-8"?>
<Invoice
  xmlns="urn:oasis:names:specification:ubl:schema:xsd:Invoice-2"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="urn:oasis:names:specification:ubl:schema:xsd:Invoice-2 ../ws/Invoice.xsd"
  xmlns:cac="urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2"
  xmlns:cbc="urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2"
  xmlns:sac="urn:oasis:names:specification:ubl:schema:xsd:SignatureAggregateComponents-2"
  xmlns:ext="urn:oasis:names:specification:ubl:schema:xsd:CommonExtensionComponents-2"
  xmlns:sig="urn:oasis:names:specification:ubl:schema:xsd:CommonSignatureComponents-2">
<ext:UBLExtensions>
  <ext:UBLExtension>
    <cbc:ID>INVOICE1</cbc:ID>
<cbc:Name>InvoiceIssuePlaceData</cbc:Name>
    <ext:ExtensionAgencyURI>urn:invoice:hr:issueplace</ext:ExtensionAgencyURI>
    <ext:ExtensionContent>
      <ext:InvoiceIssuePlace>London</ext:InvoiceIssuePlace>
    </ext:ExtensionContent>
  </ext:UBLExtension>
</ext:UBLExtensions>
<cbc:UBLVersionID>2.1</cbc:UBLVersionID>
<cbc:ID>01 1206-2406-568</cbc:ID>
</Invoice>

发票1
发票发布位置数据
urn:发票:hr:issueplace
伦敦
2.1
01 1206-2406-568
我想为所有属性创建元素,并为具有属性的节点的值在标记之间创建元素

这是xsl

<?xml version='1.0' encoding='utf-8' ?>
<xsl:stylesheet 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns="urn:oasis:names:specification:ubl:schema:xsd:Invoice-2"
  xmlns:cac="urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2"
  xmlns:cbc="urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2"
  xmlns:ext="urn:oasis:names:specification:ubl:schema:xsd:CommonExtensionComponents-2"
  xmlns:sig="urn:oasis:names:specification:ubl:schema:xsd:CommonSignatureComponents-2"
  xmlns:sac="urn:oasis:names:specification:ubl:schema:xsd:SignatureAggregateComponents-2"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="urn:oasis:names:specification:ubl:schema:xsd:Invoice-2 ../ws/Invoice.xsd"
  version="1.0">
  <xsl:output method="xml"/>
   <xsl:template match="/">
     <xsl:apply-templates/>
   </xsl:template>
   <xsl:template match="@*|*|text()">
    <xsl:copy>
     <xsl:apply-templates select="@*|*|text()"/>
    </xsl:copy>
   </xsl:template>
   <xsl:template match="*[@*]">
    <xsl:element name="{name()}">
     <xsl:if test="count(@*)>=count(node())">
      <_>
       <xsl:value-of select="."/>
      </_>
     </xsl:if>
     <xsl:for-each select="@*">
      <xsl:element name="{name()}">
       <xsl:value-of select="."/>
      </xsl:element>
     </xsl:for-each>
     <xsl:if test="count(node())>count(@*)">
      <xsl:apply-templates select="*|text()"/>
     </xsl:if> 
    </xsl:element>
   </xsl:template>
</xsl:stylesheet>

问题是这个转换并没有像我需要的那样转换根节点(Invoice)。我得到:

<?xml version="1.0"?>
<Invoice xmlns="urn:oasis:names:specification:ubl:schema:xsd:Invoice-2">
  <xsi:schemaLocation xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">urn:oasis:names:specification:ubl:schema:xsd:Invoice-2 ../ws/Invoice.xsd</xsi:schemaLocation>

urn:oasis:name:specification:ubl:schema:xsd:Invoice-2../ws/Invoice.xsd
发票中没有其他属性,并且作为新元素。仅xsi:schemaLocation,但在该节点级别定义了名称空间

我做错了什么


谢谢。

我不太清楚问题是什么,但我认为这可能与您用于将元素与当前属性匹配的模板有关

<xsl:template match="*[@*]"> 
   <xsl:element name="{name()}"> 

特别是,xsl:element命令将创建一个全新的元素,但您并没有说应该为该新元素声明哪些名称空间。试试这个

<xsl:template match="*[@*]"> 
    <xsl:copy> 


这应该创建一个发票的副本以及名称空间声明(但其属性)。

我不完全清楚问题是什么,但我认为这可能与您用来将元素与现有属性匹配的模板有关

<xsl:template match="*[@*]"> 
   <xsl:element name="{name()}"> 

特别是,xsl:element命令将创建一个全新的元素,但您并没有说应该为该新元素声明哪些名称空间。试试这个

<xsl:template match="*[@*]"> 
    <xsl:copy> 

这将创建发票的副本以及名称空间声明(但不包括其属性)。

此样式表

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>

<xsl:template match="node()">
 <xsl:copy>
  <xsl:apply-templates select="@*|node()"/>
 </xsl:copy>
</xsl:template>

<xsl:template match="@*">
 <xsl:element name="{name()}" namespace="{namespace-uri()}">
  <_><xsl:value-of select="."/></_> 
 </xsl:element>
</xsl:template>

</xsl:stylesheet>

。。。将根节点转换为

<Invoice xmlns="urn:oasis:names:specification:ubl:schema:xsd:Invoice-2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:cac="urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2" xmlns:cbc="urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2" xmlns:sac="urn:oasis:names:specification:ubl:schema:xsd:SignatureAggregateComponents-2" xmlns:ext="urn:oasis:names:specification:ubl:schema:xsd:CommonExtensionComponents-2" xmlns:sig="urn:oasis:names:specification:ubl:schema:xsd:CommonSignatureComponents-2">
  <xsi:schemaLocation>
    <_ xmlns="">urn:oasis:names:specification:ubl:schema:xsd:Invoice-2 ../ws/Invoice.xsd</_>
  </xsi:schemaLocation>

urn:oasis:name:specification:ubl:schema:xsd:Invoice-2../ws/Invoice.xsd
此样式表

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>

<xsl:template match="node()">
 <xsl:copy>
  <xsl:apply-templates select="@*|node()"/>
 </xsl:copy>
</xsl:template>

<xsl:template match="@*">
 <xsl:element name="{name()}" namespace="{namespace-uri()}">
  <_><xsl:value-of select="."/></_> 
 </xsl:element>
</xsl:template>

</xsl:stylesheet>

。。。将根节点转换为

<Invoice xmlns="urn:oasis:names:specification:ubl:schema:xsd:Invoice-2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:cac="urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2" xmlns:cbc="urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2" xmlns:sac="urn:oasis:names:specification:ubl:schema:xsd:SignatureAggregateComponents-2" xmlns:ext="urn:oasis:names:specification:ubl:schema:xsd:CommonExtensionComponents-2" xmlns:sig="urn:oasis:names:specification:ubl:schema:xsd:CommonSignatureComponents-2">
  <xsi:schemaLocation>
    <_ xmlns="">urn:oasis:names:specification:ubl:schema:xsd:Invoice-2 ../ws/Invoice.xsd</_>
  </xsi:schemaLocation>

urn:oasis:name:specification:ubl:schema:xsd:Invoice-2../ws/Invoice.xsd

我想为所有属性创建元素,并为具有属性的节点的值在
标记之间创建元素。。我不明白。您指的是什么属性?源xml中的所有和每个属性都应转换为子元素,但根节点除外,它应保留名称空间属性并为每个属性创建子元素。您的xml包含名称空间声明,但没有属性。请告诉我们预期的输出是什么样子。这个问题应该已经解决了。它已经过时了,问题也没有明确界定。摆脱令人困惑的措辞。一个简单的方法是如何使用XSLT从这个XML到这个XML?我想为所有属性创建元素,并为具有属性的节点的值在
标记之间创建元素。。我不明白。您指的是什么属性?源xml中的所有和每个属性都应转换为子元素,但根节点除外,它应保留名称空间属性并为每个属性创建子元素。您的xml包含名称空间声明,但没有属性。请告诉我们预期的输出是什么样子。这个问题应该已经解决了。它已经过时了,问题也没有明确界定。摆脱令人困惑的措辞。一个简单的例子是如何使用XSLT从这个XML转换成这个XML?