xml - XSLT 基于属性(名称)删除元素
问题描述
我正在为一些基本的 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>
解决方案
如果您的脚本引用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"添加到样式表元素中,但在您的 XML 源代码中有更长的版本,即xmlns:xmi="http://www .omg.org/spec/XMI/20131001”。
我暂时将xmlns:xmi更改为您的“缩短”版本,输出变得不同。
因此,不仅要注意是否包含所需的命名空间,还要注意它们是否引用相同的地址。
推荐阅读
- .net - 为什么在单个 CPU Core 中运行多线程变得线程安全?
- php - 显示依赖于差异数组名称的数组成员
- java - 发送短信:uid 10231 没有 android.permission.SEND_SMS
- android - 自上周以来,Ad mob 横幅广告突然停止出现,而没有对代码进行任何更改
- linux - 不显示 SQLPLUS 提示
- fuzzy-logic - 清晰数字的单个模糊隶属度值
- laravel - laravel 应用程序中未使用命名路由的应用程序基本 url
- java - 将 Excel VBA 代码集成到 Java 代码中,最终在 Excel 表格的单元格中创建从下拉列表中选择多个值的功能
- django - Django-REST:添加 API 以通过另一个字段获取实体的正确方法?
- unity3d - 如何为不同纵横比的屏幕设置 UI 位置动画?