XSLT转换-添加缺少的同级(如果不存在)

XSLT转换-添加缺少的同级(如果不存在),xslt,Xslt,我正在用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=

我正在用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(不应添加任何内容):


福
...
福
福
福
案例2(应添加x)


福
...
福
福
案例3(应添加y)


福
...
福
福
案例4(应添加x和y)


福
...
福
我尝试了以下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>
<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>
<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>
<parent>
    <a>foo</a>
    ...
    <y>foo</y>
    <z>foo</z>
 </parent>

福
...
福
福
福
福
情况4不正常

<parent>
    <a>foo</a>
    ...
    <x>foo</x>
    <y>foo</y>
    <x>foo</x>
    <z>foo</z>
 </parent>
<parent>
    <a>foo</a>
    ...
    <y>foo</y>
    <z>foo</z>
 </parent>

福
...
福
福

如果您的
父元素既不包含
x
子元素,也不包含
y
子元素,则样式表将提供两个同等优先级的模板,其模式与
父元素的
z
子元素相匹配。根据您的处理器和XSLT版本,这可能会产生错误,但更可能导致选择稍后定义的模板。这将为您插入一个
y
兄弟姐妹,而不是
x

有几种方法可以解决这个问题。特别是,您可以选择使用模板的模式还是使用
元素来整理备选方案。这里有一个样式表,它使用了两者的一点来完成这项工作:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template name="identity" match="@*|node()">
  <xsl:copy>
    <xsl:apply-templates select="@*|node()" />
  </xsl:copy>
</xsl:template>

<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(y)]/z">
  <xsl:if test="not(../x)">
    <xsl:element name="x">foo</xsl:element>
  </xsl:if>
  <xsl:element name="y">foo</xsl:element>
  <xsl:call-template name="identity"/>
</xsl:template>

</xsl:stylesheet>

福
福
福

什么不起作用?结果与预期结果有何不同?非常感谢-工作完成了:)