为什么我得到片段节点而不是此模板中的节点集?

时间:2013-08-05 10:29:11

标签: xml xslt xsd variable-assignment

大家好!

我正在尝试使用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只是一个节点片段:(

提前致谢!如果有人需要更多信息,请问我!

1 个答案:

答案 0 :(得分:2)

那么在XSLT 1.0中,您可以使用select属性填充除变量树片段以外的变量。如果您希望在结果树片段中的节点上进行XPath选择,则首先需要使用扩展函数将结果树片段转换为节点集。大多数XSLT 1.0处理器支持exslt:node-sethttp://www.exslt.org/exsl/functions/node-set/)或类似。 因此,对于您的代码,这意味着您将xmlns:exsl="http://exslt.org/common"放在xsl:stylesheet元素上,然后当您想对具有结果树片段的变量执行XPath选择时,使用exsl:node-set($var)/foo/bar即{{1} }。