1

我有一个 XSD 文档,我正试图用 XSL 解析以用于文档目的,其中 complexTypes 经常包含其他 complexTypes 的元素。如果可能的话,我想在它们的容器旁边显示这些复杂类型元素的内容。这是我正在使用的一个简单示例:

<xs:complexType name="S">
  <xs:sequence>
    <xs:element name="A" type="X"/>
  </xs:sequence>
</xs:complexType>

<xs:complexType name="X">
  <xs:sequence>
    <xs:element name="F"/>
    <xs:element name="G"/>
    <xs:element name="H"/>
  </xs:sequence>
</xs:complexType>

我如何让上面的内容显示为:“S 包含 X 类型的 A(包含 F、G 和 H)”?

提前感谢您的帮助!

添加示例:

  <xsl:for-each select="*">
    <xsl:choose>

      <!-- call template without param -->
      <xsl:when test="name() = 'xs:complexType'">
        <xsl:value-of select="@name"/>
        <xsl:text> contains </xsl:text>

        <xsl:call-template name="top"/>
        <xsl:text>&#xa;</xsl:text>
      </xsl:when>

      <!-- for contained elements with types -->
      <xsl:when test="@type != ''  and  name() = 'xs:element' and $typeToLocate = ''">
        <xsl:value-of select="@name"/>
        <xsl:text> of type </xsl:text>
        <xsl:value-of select="@type"/>
        <xsl:text>(which contains: </xsl:text>

        <!--
          point at which i want processor to return to root, locate the
          indicated complex type, output its contents then continue going
          through schema.
        -->
        <xsl:call-template name="top">
          <xsl:with-param name="typeToLocate" select="@type"/>
        </xsl:call-template>

        <xsl:text>)</xsl:text>
      </xsl:when>

      <!-- when type is located, send it to signal proper output -->
      <xsl:when test="$typeToLocate != ''  and  $typeToLocate = @name">
        <xsl:call-template name="top">
          <xsl:with-param name="typeToLocate" select="$typeToLocate"/>
        </xsl:call-template>
      </xsl:when>

      <!-- for elements contained in indicated type -->
      <xsl:when test="$typeToLocate != ''  and  name() = 'xs:element'">
        <xsl:value-of select="@name"/>
        <xsl:text> </xsl:text>

        <xsl:call-template name="top">
          <xsl:with-param name="typeToLocate" select="$typeToLocate"/>
        </xsl:call-template>
      </xsl:when>

      <!-- for continuing through non-content elements under found type -->
      <xsl:when test="$typeToLocate != ''">
        <xsl:call-template name="top">
          <xsl:with-param name="typeToLocate" select="$typeToLocate"/>
        </xsl:call-template>
      </xsl:when>

      <!-- for ignoring non-content elements during normal processing -->
      <xsl:otherwise>
        <xsl:call-template name="top"/>
      </xsl:otherwise>

    </xsl:choose>
  </xsl:for-each>

</xsl:template>
4

1 回答 1

0

为了广泛回答您的问题,而不给出具体的样式表,我建议......

(1) 创建一个模板来匹配XSD公共级别的复杂类型。所述模板的序列构造器将直接负责产生像“S”这样的文本。

(2)在所述序列构造器内,但在所述文本产生之后,在复杂类型节点上调用。这将负责所需生产的其余部分,从“包含...”开始。

(3) 创建描述内容模板。这里的序列构造器由两部分组成: (3.1) 像“contains”这样的常量产生;(3.2) 调用序列成员的应用模板。这部分将产生类似“A 类型 X(which ~)”

(4) 创建一个模板来匹配xs:sequence/xs:element。正如您从 3.2 中猜到的那样,序列构造函数将包含 3 个部分: (4.1) 生成式,如“X 类型的 A(其中” (4.2) 调用与子复杂类型相关的 describe-contents 模板);最后(4.3)不断产生“)”

如果您的目标仅限于 xs:sequence 和复杂类型,则应该这样做。尽管如此,这种基于模板的方法(模板与句法元素大致匹配)应该可以扩展到 xs:choice 等。

我假设您实际上想要对深层复杂类型定义进行递归描述。

于 2012-05-14T05:38:49.717 回答