我需要在以下转型中提供帮助。转换的一部分正在运行,但我找不到错误,为什么我不仅得到匹配的值,还得到xml文件的所有其他值。
这是我的xml文件:
<?xml version="1.0" encoding="UTF-8"?>
<Config>
<MwUri>xxx</MwUri>
<Plant>
<Name>2</Name>
<Gate>
<Name>2_Einfahrt</Name>
<NotificationURI>yyy</NotificationURI>
<Reader>
<Name>2</Name>
<Ports>
<Port>
<Type>INPUT</Type>
<Id>1</Id>
<TriggerType value="1" />
<OperationType>READ</OperationType>
</Port>
<Port>
<Type>INPUT</Type>
<Id>3</Id>
<TriggerType value="2" />
<OperationType>READ</OperationType>
</Port>
<Port>
<Type>OUTPUT</Type>
<Id>5</Id>
<TriggerType value="3" />
<OperationType>WRITE</OperationType>
<OutputDuration>1000</OutputDuration>
<DurationUnit>MS</DurationUnit>
</Port>
</Ports>
</Reader>
</Gate>
</Plant>
</Config>
这里是xslt文件:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:param name="parameterName" />
<xsl:template match="TriggerType[@value='1']">
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<opSpecs>
<opSpec>
<opType>
<xsl:value-of select="../OperationType" />
</opType>
<portSpec>
<id>
<xsl:value-of select="../Id" />
</id>
<reader>
<xsl:value-of select="../../../Name" />
</reader>
<type>
<xsl:value-of select="../Type" />
</type>
</portSpec>
</opSpec>
</opSpecs>
</s:Body>
</s:Envelope>
</xsl:template>
</xsl:stylesheet>
这就是结果:
<?xml version="1.0" encoding="UTF-8"?>
xxx
2
2_Einfahrt
yyy
2
INPUT
1
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Body xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<opSpecs>
<opSpec>
<opType>READ</opType>
<portSpec>
<id>1</id>
<reader>2</reader>
<type>INPUT</type>
</portSpec>
</opSpec>
</opSpecs>
</s:Body>
</s:Envelope>
READ
INPUT
3
READ
OUTPUT
5
WRITE
1000
MS
我需要的只是:
<opSpecs>
<opSpec>
<opType>READ</opType>
<portSpec>
<id>1</id>
<reader>2</reader>
<type>INPUT</type>
</portSpec>
</opSpec>
</opSpecs>
</s:Body>
有人能帮助我吗? :))))
答案 0 :(得分:0)
问题是,默认情况下,如果不阻止,则会将所有文本发送到输出。在原始代码中,所有文本节点都与文本节点的默认模板匹配。
因此,添加一个与text()
匹配的模板,并对这些节点不执行任何操作:
<xsl:template match="text()"/>
这也删除了所有空格,输出将是一长串XML。因此,添加另一个正确缩进生成的XML的顶级指令:
<xsl:output method="xml" indent="yes"/>
然后,结果将是
<?xml version="1.0" encoding="UTF-8"?>
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<opSpecs>
<opSpec>
<opType>READ</opType>
<portSpec>
<id>1</id>
<reader>2</reader>
<type>INPUT</type>
</portSpec>
</opSpec>
</opSpecs>
</s:Body>
</s:Envelope>