使用XSLT

时间:2017-02-15 12:22:18

标签: xml xslt

在我的一个xml有效负载中,我需要在下面一行之后添加一个命名空间。

 <?xml version="1.0" encoding="UTF-8"?>
<ep:Document  xmlns:ep="namespace here" 
xmlns:gk="namespace here"
xmlns:sh="namespace here" schemaVersion=""  creationDate="">

之后我要添加命名空间xmlns:xsi =“http://www.w3.org/2001/XMLSchema-instance”&gt;

预期输出应为

<?xml version="1.0" encoding="UTF-8"?>
 <ep:Document  xmlns:ep="namespace here" 
 xmlns:gk="namespace here"
xmlns:sh="namespace here" schemaVersion=""  creationDate=""xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
你能帮忙吗? 让我详细说明我的要求。在实际的输入消息中,我获得的负载没有任何名称空间。它看起来如下。

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

在b / w文件中我们有剩余的有效载荷。

之后我使用XSLT代码在有效负载中添加名称空间和前缀。 下面是我的XSLT代码。

<xsl:stylesheet version="1.0" 
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:ep="namespace here"
 xmlns:sh="namespace here"
 xmlns:gk="namespace here">
 <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>


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

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

 <xsl:template match="Extension|Extension//*">
<xsl:element name="gk:{name()}">
    <xsl:apply-templates select="node()|@*"/>
  </xsl:element>
  </xsl:template>

 <xsl:template match="Header|Header//*">
<xsl:element name="sh:{name()}">
    <xsl:apply-templates select="node()|@*"/>
   </xsl:element>

</xsl:stylesheet>

使用此代码后,我得到的输出如下所示。

<?xml version="1.0" encoding="UTF-8"?>
 <ep:Document  xmlns:ep="namespace here" 
 xmlns:gk="namespace here"
xmlns:sh="namespace here" schemaVersion=""  creationDate=""> 

和其余的有效载荷。所以我需要在模式版本之后再添加一个名称空间,并在帖子中提到的现有代码中创建。

1 个答案:

答案 0 :(得分:0)

如果将所需的命名空间声明添加到xsl:stylesheet元素,即:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ep="namespace here"
xmlns:sh="namespace here"
xmlns:gk="namespace here"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

可能出现在输出的根ep:Document元素的开始标记内,就像您期望的那样。我说&#34;可能&#34;,因为XSLT处理器不必包含冗余命名空间声明。

您无法控制属性和命名空间声明在开始标记中的显示顺序。根据定义,订单无关紧要。