使用类似于call-template

时间:2015-07-08 23:17:28

标签: xml xslt

我现在已经找了几个星期了,我只是放弃了。我有一个XSLT脚本来输出基于XSD定义的XML文件。我的问题在于这段代码:

示例输入,类型可以任意嵌套:

<xs:element name="rootElement">
  <xs:complexType>
    <xs:sequence>
      <xs:element ref="r1" minOccurs="0" />
      <xs:element ref="r2" minOccurs="0" />
      <xs:element ref="r3" minOccurs="0">
          <xs:complexType>
             <xs:sequence>
                 <xs:element ref="r4" minOccurs="0" />
                 <xs:element ref="r5" minOccurs="0" />
             </xs:sequence>
          </xs:complexType>
      </xs:element>
    </xs:sequence>
  </xs:complexType>
</xs:element>

XSL:              

    <!-- I wish this could work -->
    <xsl:if test="$minOccurs">
        <xsl:attribute name="minOccurs"><xsl:value-of select="$minOccurs"/></xsl:attribute>
    </xsl:if>

    <xsl:choose>
        <xsl:when test="@ref">
            <xsl:variable name="elementRef" select="current()/@ref"/>
            <xsl:for-each select="//xs:element[@name=$elementRef]">
                    <xsl:call-template name="element">
                        <xsl:with-param name="minOccurs" select="./@minOccurs"/>
                    </xsl:call-template>
            </xsl:for-each>
        </xsl:when>
        <!-- abridged -->
    </xsl:choose>
</xsl:template>

输出类似:

<rootElement>
    <r1 minOccurs="0" />
    <r2 minOccurs="0" />
    <r3 minOccurs="0">
        <r4/>
        <r5/>
    </r3>
</rootElement>

我正在做一个递归调用,它运行得很好。但是,我无法添加属性,而且我也在线阅读。那么如何更改此设置才能添加属性?

1 个答案:

答案 0 :(得分:0)

鉴于此XML输入,

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
  <xs:element name="rootElement">
    <xs:complexType>
      <xs:sequence>
        <!-- replaced original @ref with @name -->
        <xs:element name="r1" minOccurs="0" />
        <xs:element name="r2" minOccurs="0" />
        <xs:element name="r3" minOccurs="0">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="r4" minOccurs="0" />
              <xs:element name="r5" minOccurs="0" />
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

以下XSLT,

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0"
                xmlns:xs="http://www.w3.org/2001/XMLSchema"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes"/>
  <xsl:strip-space elements="*"/>

  <xsl:template match="xs:element">
    <xsl:element name="{@name}">
      <xsl:if test="@minOccurs">
        <xsl:attribute name="minOccurs">
          <xsl:value-of select="@minOccurs"/>
        </xsl:attribute>
      </xsl:if>
      <xsl:apply-templates/>
    </xsl:element>
  </xsl:template>
</xsl:stylesheet> 

将生成以下XML输出

<?xml version="1.0" encoding="UTF-8"?>
<rootElement>
   <r1 minOccurs="0"/>
   <r2 minOccurs="0"/>
   <r3 minOccurs="0">
      <r4 minOccurs="0"/>
      <r5 minOccurs="0"/>
   </r3>
</rootElement>

按要求。