1

大家好!

我正在尝试使用 XSL 1.0 来转换 XSD,但我在初始化变量时遇到了问题。

语境

好吧,这是我初始化变量的代码:

<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只是一个节点片段:(

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

4

1 回答 1

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/barie select="exsl:node-set($gNS)//*[@name=substring-after($main_type,':')]"

于 2013-08-05T12:10:06.917 回答