需要帮助从一个xml文件到另一个xml文件的XSL转换

时间:2015-03-10 15:08:07

标签: xml xslt xslt-1.0 transformation

我需要在以下转型中提供帮助。转换的一部分正在运行,但我找不到错误,为什么我不仅得到匹配的值,还得到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>

有人能帮助我吗? :))))

1 个答案:

答案 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>