我现在已经找了几个星期了,我只是放弃了。我有一个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>
我正在做一个递归调用,它运行得很好。但是,我无法添加属性,而且我也在线阅读。那么如何更改此设置才能添加属性?
答案 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>
按要求。