我在XSLT中进行转换。如果失踪,我必须添加兄弟姐妹。
我正在转换由以下XSD给出的XML:
<xs:complexType name="parent">
<xs:sequence>
<xs:element name="a" type="xs:string" minOccurs="0"/>
... more optional elements...
<xs:element name="x" type="xs:string" minOccurs="0"/>
<xs:element name="y" type="xs:string" minOccurs="0"/>
<xs:element name="z" type="xs:string"/>
</xs:sequence>
</xs:comlexType>
到以下XSD给出的XML
<xs:complexType name="parent">
<xs:sequence>
<xs:element name="a" type="xs:string" minOccurs="0"/>
... more optional elements...
<xs:element name="x" type="xs:string"/>
<xs:element name="y" type="xs:string"/>
<xs:element name="z" type="xs:string"/>
</xs:sequence>
</xs:comlexType>
表示元素x和y从可选到必需,如果缺少则应添加。这意味着我的XSLT转换应该处理以下4种情况:
案例1 (不应添加任何内容):
<parent>
<a>foo</a>
...
<x>foo</x>
<y>foo</y>
<z>foo</z>
</parent>
案例2 (应添加x)
<parent>
<a>foo</a>
...
<y>foo</y>
<z>foo</z>
</parent>
案例3 (应添加y)
<parent>
<a>foo</a>
...
<x>foo</x>
<z>foo</z>
</parent>
案例4 (应添加x和y)
<parent>
<a>foo</a>
...
<z>foo</z>
</parent>
我尝试过以下不能按预期工作的XSLT:
<xsl:template match="parent[not(x)]/y">
<xsl:element name="x">foo</xsl:element>
<xsl:call-template name="identity"/>
</xsl:template>
<xsl:template match="parent[not(x)]/z">
<xsl:element name="x">foo</xsl:element>
<xsl:call-template name="identity"/>
</xsl:template>
<xsl:template match="parent[not(y)]/z">
<xsl:element name="y">foo</xsl:element>
<xsl:call-template name="identity"/>
</xsl:template>
以上案例的结果如下:
案例1 确定
<parent>
<a>foo</a>
...
<x>foo</x>
<y>foo</y>
<z>foo</z>
</parent>
案例2 确定
<parent>
<a>foo</a>
...
<x>foo</x>
<y>foo</y>
<z>foo</z>
</parent>
案例3 不行
<parent>
<a>foo</a>
...
<x>foo</x>
<y>foo</y>
<x>foo</x>
<z>foo</z>
</parent>
案例4 不行
<parent>
<a>foo</a>
...
<y>foo</y>
<z>foo</z>
</parent>
答案 0 :(得分:0)
如果您的parent
元素没有x
或y
子元素,则样式表会提供两个等优先级模板,模式与parent
的{{1}}子项匹配。根据您的处理器和XSLT版本,可能会产生错误,但更有可能导致选择后面定义的模板。这会让你插入一个z
兄弟,但不会是y
。
有几种方法可以解决这个问题。特别是,您可以选择使用模板的模式和使用x
元素来排序替代方案。这是一个样式表,它使用两者来完成这项工作:
<xsl:if>