不能使用 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
不需要有名字。
我从 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
不需要有名字。