XSD文件:
<xs:element name="Header">
<xs:complexType>
<xs:sequence>
<xs:element name="MessageHeader">
<xs:complexType>
<xs:sequence>
<xs:element name="demoName" type="xs:string" />
<xs:element name="purpose">
<xs:complexType>
<xs:sequence>
<xs:element maxOccurs="unbounded" name="purposeMessage">
<xs:complexType>
<xs:sequence>
<xs:element name="unit" type="xs:string" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
我想检查输入XML文件中是否存在元素purpose
如果它存在,那么我想要取其价值,如果不是,那么我想忽略它的价值。
我在下面试过,但它不起作用。
XSLT:
<Header>
<MessageHeader>
<xsl:for-each select="field[@name= 'Header']/object[@class='com.demo.ttt.xml.MessageHeader']/field">
<xsl:variable name="var:varValue" select="value/text()" />
<xsl:if test="string($var:varValue) = 'purpose'">
<xsl:element name="{@name}" >
<xsl:value-of select="$var:varValue" />
</xsl:element>
</xsl:if>
</xsl:for-each>
</MessageHeader>
</Header>
输入XML:
<?xml version="1.0" encoding="UTF-16" standalone="yes"?>
<field name="Header">
<object class="com.demo.ttt.xml.MessageHeader">
<field name="demoName">
<value class="java.lang.String"/>
</field>
<field name="purpose">
<array class="com.demo.ttt.xml.purposeMessage" length="1" level="1">
<object class="com.demo.cce.eai.condition.xml.purposeMessage">
<field name="unit">
<value class="java.lang.String">Z01</value>
</field>
</object>
</array>
</field>
</object> <!-- added by edit -->
</field> <!-- added by edit -->
purposeMessage是具有多个元素的数组,所以我需要再使用一个内部,如果条件如何做到这一点?
预期产出是 -
<Header>
<MessageHeader>
<purpose><unit>Z01</unit></purpose>
</MessageHeader>
</Header>
如果目的有多个元素,那么它将在
中创建多个元素答案 0 :(得分:1)
如果<value>
元素的<purpose>
属性具有值{{},则以下XSLT-1.0解决方案将@name
子元素的文本值包装在<field>
元素中{1}}。每个purpose
都会创建一个自己的条目作为<object>
元素的子项。
因此,代码将创建所需的输出,而不是使用<purpose>
,而是使用一组模板,每个模板都符合特定情况:
for-each
输出为:
<!-- removes <field name="demoName"> from the XML -->
<xsl:template match="field[@name = 'demoName']" priority="1" />
<xsl:template match="field" >
<xsl:element name="{@name}">
<xsl:apply-templates />
</xsl:element>
</xsl:template>
<xsl:template match="field[value]" >
<xsl:element name="{@name}">
<xsl:value-of select="value/text()" />
</xsl:element>
</xsl:template>
<xsl:template match="object[@class='com.demo.ttt.xml.MessageHeader']" >
<MessageHeader>
<xsl:apply-templates />
</MessageHeader>
</xsl:template>
<xsl:template match="array" >
<xsl:apply-templates />
</xsl:template>
编辑:更改了整个模板集。