我想使用XSLT转换一些xmi文件。一切正常,但我不明白为什么<body>
标记值&#34;版本1.0&#34;和&#34; EAUML版本:1.0&#34;由我的模板&#34; packagedElement&#34;复制(见输出)。
xmi文件:
<?xml version="1.0" encoding="windows-1252"?>
<xmi:XMI xmi:version="2.1" xmlns:uml="http://schema.omg.org/spec/UML/2.1" xmlns:xmi="http://schema.omg.org/spec/XMI/2.1" xmlns:thecustomprofile="http://www.sparxsystems.com/profiles/thecustomprofile/1.0" xmlns:EAUML="http://www.sparxsystems.com/profiles/EAUML/1.0">
<uml:Model xmi:type="uml:Model" name="EA_Model" visibility="public">
<packagedElement xmi:type="uml:Package" name="Test" visibility="public">
...
</packagedElement>
</uml:Model>
<xmi:Extension>
<profiles>
<uml:Profile xmi:version="2.1" xmlns:uml="http://schema.omg.org/spec/UML/2.1/" xmlns:xmi="http://schema.omg.org/spec/XMI/2.1" xmi:id="thecustomprofile" nsPrefix="thecustomprofile" name="thecustomprofile" metamodelReference="mmref01">
<ownedComment xmi:type="uml:Comment" xmi:id="comment01" annotatedElement="thecustomprofile">
<body> Version:1.0</body>
</ownedComment>
<packagedElement xmi:type="uml:Stereotype" xmi:id="enum" name="enum"/>
...
</uml:Profile>
<uml:Profile xmi:version="2.1" xmlns:uml="http://schema.omg.org/spec/UML/2.1/" xmlns:xmi="http://schema.omg.org/spec/XMI/2.1" xmi:id="8C9E6706-8" nsPrefix="EAUML" name="EAUML" metamodelReference="mmref01">
<ownedComment xmi:type="uml:Comment" xmi:id="comment01" annotatedElement="8C9E6706-8">
<body>EAUML Version:1.0</body>
</ownedComment>
...
</uml:Profile>
</profiles>
</xmi:Extension>
</xmi:XMI>
XSLT文件(<xsl:if>
内的代码与我的问题无关):
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xmi="http://schema.omg.org/spec/XMI/2.1"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:uml="http://www.omg.org/spec/UML/20131001"
xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore">
<xsl:strip-space elements="*"/>
<xsl:output indent="yes"/>
<xsl:template match="/">
<ecore:EPackage>
<xsl:apply-templates mode="packagedElement" />
</ecore:EPackage>
</xsl:template>
<xsl:template match="packagedElement" mode="packagedElement">
<xsl:if test="(@xmi:type='uml:Package')">
</xsl:if>
</xsl:template>
</xsl:stylesheet>
输出:
<?xml version="1.0"?>
<ecore:EPackage xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" xmlns:xmi="http://schema.omg.org/spec/XMI/2.1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:uml="http://www.omg.org/spec/UML/20131001"> Version:1.0 EAUML Version:1.0 </ecore:EPackage>
答案 0 :(得分:3)
您看到的是built-in template rules应用于任何一个模板未明确匹配的节点的结果。
要解决此问题,请添加模板以防止默认情况下复制文本节点:
<xsl:template match="text()" mode="packagedElement"/>
或 - 最好是恕我直言 - 更有选择地应用模板。