XSLT转换 - 如果不存在则添加缺少的兄弟姐妹

时间:2017-03-07 14:50:35

标签: 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="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>

1 个答案:

答案 0 :(得分:0)

如果您的parent元素没有xy子元素,则样式表会提供两个等优先级模板,模式与parent的{​​{1}}子项匹配。根据您的处理器和XSLT版本,可能会产生错误,但更有可能导致选择后面定义的模板。这会让你插入一个z兄弟,但不会是y

有几种方法可以解决这个问题。特别是,您可以选择使用模板的模式和使用x元素来排序替代方案。这是一个样式表,它使用两者来完成这项工作:

<xsl:if>