大家好!
我正在尝试使用XSL 1.0来转换XSD,但是我在初始化变量时遇到了问题。
CONTEXT
好吧,这是我初始化变量的代码:
<xsl:variable name="gNS">
<xsl:call-template name="get_global_NS">
<xsl:with-param name="type" select="$main_type"/>
<xsl:with-param name="class_type" select="$class"/>
</xsl:call-template>
</xsl:variable>
现在,模板get_global_NS
代码:
<xsl:template name="get_global_NS">
<xsl:param name="type"/>
<xsl:param name="class_type"/>
<xsl:variable name="prefix" select="substring-before($type,':')"/>
<xsl:choose>
<xsl:when test="$prefix = 'b'">
<xsl:value-of select="$ns_base"/>
</xsl:when>
<xsl:otherwise>
<xsl:choose>
<xsl:when test="$prefix = 'c'">
<xsl:value-of select="$ns_conceptuels"/>
</xsl:when>
<xsl:otherwise>
<xsl:choose>
<xsl:when test="$prefix = 'd' and contains($class_type,'A5')">
<xsl:value-of select="$ns_dom_a5"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$ns_dom_vega"/>
</xsl:otherwise>
</xsl:choose>
</xsl:otherwise>
</xsl:choose>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
变量$ns_base
,$ns_conceptuels
,$ns_dom_a5
和$ns_dom_vega
被定义为全局变量。所有这些都使用文档节点初始化。以下行是ns_base
的初始化:
<xsl:variable name="ns_base" select="document('../Types/Base.xsd')"/>
问题
好吧,当我在调用其他命名模板时尝试使用gNS
变量来选择节点时,我遇到了问题。它是节点片段而不是节点。
这里有麻烦点:
<xsl:call-template name="write_type">
<!--
This temaplate process a xs:simpleType or xs:complexType named like the mainType.
Due to the main_type has a namespace prefix, I get the actual name calling
substring-after() function
-->
<xsl:with-param name="type_elem" select="$gNS//*[@name=substring-after($main_type,':')]"/>
<xsl:with-param name="fed_type" select="$type"/>
</xsl:call-template>
问题出在这个选择中:select="$gNS//*[@name=substring-after($main_type,':')]"
。 $gNS
只是一个节点片段:(
提前致谢!如果有人需要更多信息,请问我!
答案 0 :(得分:2)
那么在XSLT 1.0中,您可以使用select
属性填充除变量树片段以外的变量。如果您希望在结果树片段中的节点上进行XPath选择,则首先需要使用扩展函数将结果树片段转换为节点集。大多数XSLT 1.0处理器支持exslt:node-set
(http://www.exslt.org/exsl/functions/node-set/)或类似。
因此,对于您的代码,这意味着您将xmlns:exsl="http://exslt.org/common"
放在xsl:stylesheet
元素上,然后当您想对具有结果树片段的变量执行XPath选择时,使用exsl:node-set($var)/foo/bar
即{{1} }。