【问题标题】:Need help at XSL transformation from one xml file to another one在从一个 xml 文件到另一个 xml 文件的 XSL 转换方面需要帮助
【发布时间】:2015-03-10 15:08:06
【问题描述】:

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

有人可以帮助我吗? :)))))

【问题讨论】:

  • 哦,对不起。我当然需要这个结果:
  • schemas.xmlsoap.org/soap/envelope"> w3.org/2001/XMLSchema" xmlns:xsi="w3.org/2001/XMLSchema-instance"> READ12INPUT s:Body>
  • 您可以编辑您的帖子并包含此信息,而不是将其作为评论发布。谢谢!

标签: xml xslt xslt-1.0 transformation


【解决方案1】:

问题在于,默认情况下,如果您不阻止,所有文本都会发送到输出。在您的原始代码中,所有文本节点都由文本节点的 default 模板匹配。

所以,添加一个与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>

【讨论】:

  • 您好 Mathias,感谢您的快速回复 :))) 但在这种情况下,我将始终从第一个端口获取值,对吧?!我需要能够搜索不同的 TriggerTypes 并用不同的值填充新的 xml(--> 转换后)。
  • @hartman 这不会以任何方式改变您的转换,只是多余的文本会消失。如果您想更改 XML 输出,请编辑您的问题并显示输出的确切内容。
  • @Mathias:在我将这两行添加到我的 xslt 后,它起作用了。非常感谢。你是最棒的!!!
  • @hartman 欢迎您。如果它解决了您的问题,请不要忘记accept this answer。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-06-26
  • 2012-04-21
  • 2016-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-27
相关资源
最近更新 更多