XSLT转换-添加缺少的同级(如果不存在)
我正在用XSLT进行转换。如果丢失,我必须添加兄弟姐妹 我正在转换以下XSD给出的XML: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=
<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>
福
福
福
什么不起作用?结果与预期结果有何不同?非常感谢-工作完成了:)