想象一下以下架构作为输入
<xs:schema>
<xs:element name="In">
<xs:complexType>
<xs:sequence>
<xs:element name="InA">
<xs:complexType>
<xs:sequence>
<xs:element name="InA1" type="xs:string" />
<xs:element name="InA2" type="xs:string" />
<xs:element name="InA3" type="xs:string" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="InB">
<xs:complexType>
<xs:sequence>
<xs:element name="InB1" type="xs:string" />
<xs:element name="InB2" type="xs:string" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
例如
<In>
<InA>
<InA1>InA1_0</InA1>
<InA2>InA2_0</InA2>
<InA3>InA3_0</InA3>
</InA>
<InB>
<InB1>InB1_0</InB1>
<InB2>InB2_0</InB2>
</InB>
</In>
现在,我需要将其映射到另一个模式,因为一些规则是:
我想要做到这一点的唯一方法是在Out元素之前做一个if,但这对于孩子Out来说是非常乏味和有问题的。
<xsl:if test="/In/InA/InA1 != '' and /In/InA/InB2 != '' and /In/InA/InA3 != ''">
<Out>
<xsl:if test="/In/InA/InA1 != ''">
<Out1>
<xsl:value-of select="/In/InA/InA1/text()">
</Out1>
</xsl:if>
<xsl:if test="/In/InA/InB2 != ''">
<Out2>
<xsl:value-of select="/In/InB/InB2/text()">
</Out2>
</xsl:if>
<xsl:if test="/In/InA/InA3 != ''">
<Out3>
<xsl:value-of select="/In/InA/InA3/text()">
</Out3>
</xsl:if>
</Out>
</xsl:if>
任何人都有任何其他方式在一张地图中这样做?
这是我出来的。我们的想法是在变量中执行内部映射,然后检查变量是否为空。如果不是,那么我可以映射。
<xsl:variable name="out-Node">
<xsl:if test="/In/InA/InA1 != ''">
<Out1>
<xsl:value-of select="/In/InA/InA1/text()">
</Out1>
</xsl:if>
<xsl:if test="/In/InA/InB2 != ''">
<Out2>
<xsl:value-of select="/In/InB/InB2/text()">
</Out2>
</xsl:if>
<xsl:if test="/In/InA/InA3 != ''">
<Out3>
<xsl:value-of select="/In/InA/InA3/text()">
</Out3>
</xsl:if>
</xsl:variable>
<xsl:if test="$out-Node != ''">
<Out>
<xsl:copy-of select="$out-Node"/>
</Out>
</xsl:if>
当然,这种方法必须有问题,我猜其中一个就是性能。