从XSLT中的序列化XML删除名称空间 [英] Remove namespace from serialized XML in XSLT

查看:64
本文介绍了从XSLT中的序列化XML删除名称空间的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试通过XSLT 3中的一些转换将XML转换为Json.我有如下所示的XML示例

I am trying convert XML to Json with some transformation in XSLT 3. I have sample XML as shown below

示例XML:

<Root>
 <Employees xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
     <Employee>
      <name>abc</name>
     </Employee>
      <Employee>
      <name>def</name>
     </Employee>
  <summary>
   <Age>15</Age>
   <tag1>dd</tag1>
   <tag2>dd</tag2>
   <tag2>dd</tag2>
  </summary>
 </Employees>
</Root>

我的XSLT模板

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="#all"
version="3.0">
<xsl:strip-space elements="*"/>
<xsl:output method="json" indent="yes"/>
<xsl:template match="/Root">
<xsl:for-each select="Employees">
    <xsl:sequence select="map { 'Root' : 
              array { 
                  Employee[name!=''] ! map {
                        'Name':data(name),
                        'Date': format-dateTime(current-dateTime(), '[Y0001]-[M01]-[D01]T[H01]:[m01]:[s01].[f0000001]Z'),
                  'Summary': 'Employee: ' || data(name) ||'  Summary : ' || serialize(../summary)
                  }
                  }
          }"/>
   </xsl:for-each>
  </xsl:template>

</xsl:stylesheet>

输出:

 {
 "Root": [
 {
  "Summary":"Employee: abc  Summary : <summary xmlns:xsi=\"http:\/\/www.w3.org\/2001\/XMLSchema-instance\" xmlns:xsd=\"http:\/\/www.w3.org\/2001\/XMLSchema\"><Age>15<\/Age><tag1>dd<\/tag1><tag2>dd<\/tag2><tag2>dd<\/tag2><\/summary>",
  "Name":"abc",
  "Date":"2021-02-08T09:03:22.4740000Z"
 },
 {
  "Summary":"Employee: def  Summary : <summary xmlns:xsi=\"http:\/\/www.w3.org\/2001\/XMLSchema-instance\" xmlns:xsd=\"http:\/\/www.w3.org\/2001\/XMLSchema\"><Age>15<\/Age><tag1>dd<\/tag1><tag2>dd<\/tag2><tag2>dd<\/tag2><\/summary>",
  "Name":"def",
  "Date":"2021-02-08T09:03:22.4740000Z"
  }
 ]
}

小提琴: https://xsltfiddle.liberty-development.net/6q1SDkM/5

我遇到的问题是,摘要节点在输出中显示名称空间.看起来名称空间来自Employee节点中提到的XML树.我如何删除名称空间.同样在日期格式中,我们可以得到分数秒,最高为7位数字.现在我只能得到毫秒数

I am facing issues where the summary node shows the namespaces in output. Looks like namespaces comes from XML tree which is mentioned in Employee node.How i can remove namespace. Also in date formatting can we get fraction seconds upto 7 digits. Right now i am able to get only milliseconds

推荐答案

正如我在对上一个问题的评论中所说的那样,您可以通过明确不复制名称空间的模式来推送元素:

As I said in a comment to your previous question, you can push the element through a mode that explicitly doesn't copy namespaces:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:mf="http://example.com/mf"
    exclude-result-prefixes="#all"
    version="3.0">
    
  <xsl:strip-space elements="*"/>

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

 <xsl:template match="/Root">
    <xsl:for-each select="Employees">
      
        <xsl:sequence select="map { 'Root' : 
                  array { 
                      Employee[name!=''] ! map {
                            'Name':data(name),
                            'Date': format-dateTime(current-dateTime(), '[Y0001]-[M01]-[D01]T[H01]:[m01]:[s01].[f0000001]Z'),
                      'Summary': 'Employee: ' || data(name) ||'  Summary : ' || ../summary => mf:strip-namespaces() => serialize()
                      }
                      }
              }"/>
      </xsl:for-each>
    </xsl:template>
    
    <xsl:mode name="strip-namespaces" on-no-match="shallow-copy"/>
    
    <xsl:template mode="strip-namespaces" match="*">
        <xsl:copy copy-namespaces="no">
            <xsl:apply-templates select="@* | node()" mode="#current"/>
        </xsl:copy>
    </xsl:template>
    
    <xsl:function name="mf:strip-namespaces" as="node()">
        <xsl:param name="node" as="node()"/>
        <xsl:apply-templates select="$node" mode="strip-namespaces"/>
    </xsl:function>
  
</xsl:stylesheet>

https://xsltfiddle.liberty-development.net/6q1SDkM/6

这篇关于从XSLT中的序列化XML删除名称空间的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆