使用XSLT删除XML中的一些节点

时间:2019-05-10 10:08:20

标签: xml xslt line

我有一个XML文件,并且想要使用XSLT将其格式化为新的XML文件,而忽略了原始文件中的一些信息。删除某些行效果很好,但是某些表达式仍然存在问题。代码很长,这就是为什么我只在此处摘录一些原因。

Here my source XML file:

<?xml version="1.0" encoding="UTF-8"?>
<xmi:XMI xmi:version="20131001" xmlns:xmi="http://www.omg.org/spec/XMI/20131001" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:Blocks="http://www.eclipse.org/papyrus/sysml/1.4/SysML/Blocks" xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" xmlns:uml="http://www.eclipse.org/uml2/5.0.0/UML" xsi:schemaLocation="http://www.eclipse.org/papyrus/sysml/1.4/SysML/Blocks http://www.eclipse.org/papyrus/sysml/1.4/SysML#//blocks">
  <uml:Model xmi:id="_fPkgIHI3EemHwJRDr6_Icw" name="Sysml_project">
    <packageImport xmi:type="uml:PackageImport" xmi:id="_fbVrSnI3EemHwJRDr6_Icw">
      <importedPackage xmi:type="uml:Model" href="pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#_0"/>
    </packageImport>
    <packageImport xmi:type="uml:PackageImport" xmi:id="_fcFSIHI3EemHwJRDr6_Icw">
      <importedPackage xmi:type="uml:Package" href="pathmap://SysML14_LIBRARIES/SysML-Standard-Library.uml#SysML.package_packagedElement_Libraries"/>
    </packageImport>
    <packagedElement xmi:type="uml:Class" xmi:id="_ja4qAHI3EemHwJRDr6_Icw" 

<!-- Here I have shortened the code -->

  <Blocks:Block xmi:id="_jfDYUHI3EemHwJRDr6_Icw" base_Class="_ja4qAHI3EemHwJRDr6_Icw"/>
  <Blocks:Block xmi:id="_lIs2sHI3EemHwJRDr6_Icw" base_Class="_lIjswHI3EemHwJRDr6_Icw"/>
  <Blocks:Block xmi:id="_xwtDkXI4EemHwJRDr6_Icw" base_Class="_xwtDkHI4EemHwJRDr6_Icw"/>
  <Blocks:Block xmi:id="_SkqB0HI5EemHwJRDr6_Icw" base_Class="_SkgQ0HI5EemHwJRDr6_Icw"/>
  <Blocks:Block xmi:id="_Z7qroHI5EemHwJRDr6_Icw" base_Class="_Z7g6oHI5EemHwJRDr6_Icw"/>
</xmi:XMI>

这是我的XSL表达式,最后您可以看到我能怎么做

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:uml="href://org.omg/UML/1.3"
            xmlns:xmi="http://www.omg.org/XMI" version="1.0">

<xsl:output method="xml" indent="yes" />
<xsl:strip-space elements="*" />

<!-- Copy everything -->
<xsl:template match="*">
    <xsl:copy>
        <xsl:copy-of select="@*" />
        <xsl:apply-templates />
    </xsl:copy>
</xsl:template>


 <!-- in the following there are the expressions how I deleted the other lines  -->


<xsl:template match="lowerValue"/>
<xsl:template match="eAnnotations"/>    
<xsl:template match="type"/>
<xsl:template match="profileApplication"/>

<xsl:template match="uml:Model">
    <xsl:apply-templates />
</xsl:template>
</xsl:stylesheet>

最后我要删除五行块:块 和代码顶部的信息,例如Version,schemaLocation

这可能吗?

1 个答案:

答案 0 :(得分:1)

1。。要从XML中删除任何空节点,可以使用以下命令:

<xsl:template match="*[not(node())]" />

2。。要从XML中删除某些特定的空节点,例如Blocks:Block,可以使用:

<xsl:template match="Blocks:Block[not(node())]" />

注意:要在上面使用,您需要在xmlns:Blocks="http://www.eclipse.org/papyrus/sysml/1.4/SysML/Blocks"定义中添加命名空间<xsl:stylesheet>

3。。要删除顶部的version和schemaLocation之类的属性,请按如下所示更新模板:

    <!-- Copy everything -->
    <xsl:template match="*">
        <xsl:copy>
            <xsl:copy-of select="@*[not(name() = 'xsi:schemaLocation') and not(name() = 'xmi:version')]"/>
            <xsl:apply-templates />
        </xsl:copy>
    </xsl:template>

在此处查看演示:https://xsltfiddle.liberty-development.net/bnnZWu