不能使用 XSLT xml 中的 select 属性

Can´t select attributes from xml with XSLT

我从 EA Sparx 生成 xml。它将作为我转换的输入,所以这是 XML 输入:

 <?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">
    <xmi:Documentation exporter="Enterprise Architect" exporterVersion="6.5"/>
    <uml:Model xmi:type="uml:Model" name="EA_Model" visibility="public">
    ...
    </uml:Model>
    <xmi:Extension extender="Enterprise Architect" extenderID="6.5">
    ...
    </xmi:Extension>
</xmi:XMI>

我创建了简单的 Java 转换程序,我还导入了外部库 saxon9he.jar。我认为它是 XSLT 2.0 的库。我创建了这个 XSLT:

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

<xsl:output method="xml" encoding="windows-1252"  indent="yes"/>

    <xsl:template name="Base" match="/">
        <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">
        <xmi:Documentation exporter="Enterprise Architect" exporterVersion="6.5"/>
            <xsl:call-template name="model"  />
            <xsl:call-template name="extension"/>
        </xmi:XMI>
    </xsl:template>

    <xsl:template name="model" match="uml:Model">
        <uml:Model>
        xmi:type= <xsl:value-of select="@xmi:type"/>
        name= <xsl:value-of select="@name"/>
        visibility=<xsl:value-of select="@visibility"/>
        </uml:Model>
    </xsl:template>

     <xsl:template name="extension" match="xmi:Extension">
         extension
     </xsl:template>
</xsl:stylesheet>

并创建此 XML 输出:

<?xml version="1.0" encoding="windows-1252"?>
    <xmi:XMI xmlns:uml="http://schema.omg.org/spec/UML/2.1"
             xmlns:xmi="http://schema.omg.org/spec/XMI/2.1"
             xmi:version="2.1">
       <xmi:Documentation exporter="Enterprise Architect" exporterVersion="6.5"/>
       <uml:Model>
            xmi:type= 
            name= 
            visibility=
        </uml:Model>
             extension
    </xmi:XMI>

为什么输出 xml 没有 selecting 属性?为什么它们是空的?我找不到 xsl:value-of select 的问题在哪里?请帮我解决这个问题。

调用命名模板不会更改当前上下文。而不是:

<xsl:call-template name="model"  />

尝试:

<xsl:apply-templates select="xmi:XMI/uml:Model"/>

否则,您将停留在 / 根节点的上下文中,该节点没有您尝试检索的任何属性。

当然模板匹配uml:Model不需要有名字。