【问题标题】:XSLT remove element based on attribute (name)XSLT 基于属性(名称)删除元素
【发布时间】:2019-05-16 09:44:48
【问题描述】:

我正在为一些基本的 XSLT 苦苦挣扎。我想从某些 XML 中删除一个元素,具体取决于它是否具有特定名称。

编辑:这是我的“真实”XML 代码:

              <?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"/>

        <!-- Here I shortened the Code  -->


               </packagedElement>
                <packagedElement xmi:type="uml:Association" xmi:id="_i8Uz0HI5EemHwJRDr6_Icw" memberEnd="_i8ek0nI5EemHwJRDr6_Icw _i8ek1XI5EemHwJRDr6_Icw">
                  <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_i8ek0HI5EemHwJRDr6_Icw" source="org.eclipse.papyrus">
                    <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_i8ek0XI5EemHwJRDr6_Icw" key="nature" value="UML_Nature"/>
                  </eAnnotations>
                  <ownedEnd xmi:type="uml:Property" xmi:id="_i8ek1XI5EemHwJRDr6_Icw" name="quelle" type="_ja4qAHI3EemHwJRDr6_Icw" association="_i8Uz0HI5EemHwJRDr6_Icw"/>
                </packagedElement>


<!-- This packagedElement I won´t delete, because here the xmi:type is uml:Class  -->

 <packagedElement xmi:type="uml:Class" xmi:id="_ja4qAHI3EemHwJRDr6_Icw" name="Quelle">
          <ownedAttribute xmi:type="uml:Property" xmi:id="_i8ek0nI5EemHwJRDr6_Icw" name="produktion" type="_xwtDkHI4EemHwJRDr6_Icw" association="_i8Uz0HI5EemHwJRDr6_Icw">
            <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_rF6SoHJQEemHwJRDr6_Icw"/>
            <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_i8ek1HI5EemHwJRDr6_Icw" value="*"/>   
</packagedElement>

                </xmi:XMI>

如果 xmi:type 是“uml:Association”,我想删除 'packagedElement' 元素并删除该元素,所以我最终会得到以下结果:

<root>
    <packagedElement xmi:type="uml:class" name="test">

    </packagedElement>

</root>

以下是我的 Xsl 代码:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <!--identity template copies everything forward by default-->     
  <xsl:template match="node()|@*">
    <xsl:copy>
      <xsl:apply-templates select="node()|@*"/>
    </xsl:copy>
  </xsl:template>

  <!--empty template suppresses this attribute-->
  <xsl:template match="packagedElement[@xmi:type='uml:Association']"/>
</xsl:stylesheet>

【问题讨论】:

  • 您的 XML 真的看起来像那样吗,或者实际上是否有 xlmns:xmi=''..." 形式的命名空间声明,或者可能只是 xmlns="..."?如果是这样,您也应该在 XML 中显示这些内容。谢谢!
  • 我正在编辑我的文件,希望对您有所帮助:)
  • 我认为您只需在&lt;xsl:stylesheet&gt; 中添加xmlns:xmi="http://www.omg.org/spec/XMI/20131001"。您的代码应该可以正常工作。
  • 我已经在我的顶部:w3.org/1999/XSL/Transform" xmlns:uml ="href://org.omg/UML/1.3" xmlns:xsi="w3.org/2001/XMLSchema-instance" xmlns:Blocks="eclipse.org/papyrus/sysml/1.4/SysML/Blocks" xmlns:xmi="omg.org/XMI" version="1.0"> 我可以不添加您的印象...

标签: xml xslt


【解决方案1】:

如果您的脚本引用xmi 命名空间,则它必须包含在脚本的主要元素中。 所以stylesheet必须包含xmlns:xmi="..."

下面有一个示例脚本。 我还添加了xsl:output 以打开缩进和xsl:strip-space 到 过滤掉不必要的空格。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xmi="http://www.omg.org/spec/XMI/20131001">
    <xsl:output method="xml" indent="yes"/>
    <xsl:strip-space elements="*"/>

    <xsl:template match="packagedElement[@xmi:type='uml:Association']"/>

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

我注意到在您添加的对您的问题的评论中 xmlns:xmi="omg.org/XMI"stylesheet 元素,但是 在您的 XML 源代码中有一个较长的版本,即 xmlns:xmi="http://www.omg.org/spec/XMI/20131001"

我暂时将 xmlns:xmi 更改为您的“缩短”版本和输出 变得不一样了。

因此,不仅要注意是否包含所需的命名空间, 还有它们是否引用相同的地址。

【讨论】:

    猜你喜欢
    • 2010-12-26
    • 1970-01-01
    • 2021-03-28
    • 1970-01-01
    • 1970-01-01
    • 2011-10-07
    • 2021-05-20
    • 1970-01-01
    相关资源
    最近更新 更多