Удалить некоторые узлы в XML с помощью XSLT - PullRequest
1 голос
/ 10 мая 2019

У меня есть 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 Ответ

1 голос
/ 10 мая 2019

1. Для удаления любого пустого узла из XML вы можете использовать следующее:

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

2. Для удаления какого-либо определенного пустого узла, такого как Blocks:Block, из XML вы можете использовать:

<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

...