将子节点的值放入foreach循环

时间:2018-10-09 08:12:48

标签: xml xslt xslt-2.0

我想将子节点的值放入“ foreach”循环中。

这是原始的XML信封:

                    <ns2:pointOfSale xmlns:ns2="" mode="UPDATE" timestamp="2018-10-08T16:18:57.611+02:00">
                        <ns2:id type="AMP">7451</ns2:id>
                        <ns2:info>
                            <ns2:type>AMP</ns2:type>
                            <ns2:name>PASSE</ns2:name>
                            <ns2:address>
                                <ns2:streetName>JEZUSSTRAAT</ns2:streetName>
                                <ns2:streetNumber>15</ns2:streetNumber>
                                <ns2:postalCode>20</ns2:postalCode>
                                <ns2:city>ANTWERPEN</ns2:city>
                                <ns2:countryCode>BE</ns2:countryCode>
                            </ns2:address>
                            <ns2:phoneNumber>0323</ns2:phoneNumber>
                            <ns2:faxNumber>0323</ns2:faxNumber>
                        </ns2:info>
                        <ns2:deliveryInfo>
                            <ns2:info>
                                <ns2:name>HANDLING PLACE</ns2:name>
                                <ns2:value>F3</ns2:value>
                            </ns2:info>
                            <ns2:info>
                                <ns2:name>BOX NUMBER</ns2:name>
                                <ns2:value>A</ns2:value>
                            </ns2:info>
                            <ns2:info>
                                <ns2:name>POS CLASSIFICATION</ns2:name>
                                <ns2:value>0</ns2:value>
                            </ns2:info>
                            <ns2:info>
                                <ns2:name>AMP ZONE</ns2:name>
                                <ns2:value>1</ns2:value>
                            </ns2:info>
                        </ns2:deliveryInfo>
                    </ns2:pointOfSale>

这是我的xslt代码:

    <?xml version="1.1" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:xd="http://www.oxygenxml.com/ns/doc/xsl"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    exclude-result-prefixes="xs xd"
    version="2.0">

    <xsl:output method="xml" version="1.0" encoding="utf-8" omit-xml-declaration="no" indent="no" />
    <xsl:strip-space elements="*" />

    <xsl:template match="/">
        <xsl:element name="clients">
            <xsl:attribute name="xsi:noNamespaceSchemaLocation">setClients.xsd</xsl:attribute>
            <xsl:attribute name="encryptedData">N</xsl:attribute>
            <xsl:for-each select="/body/salesItem/contentSet/inlineXML/group/pointOfSale">


                    <xsl:if test="@mode='UPDATE'">
                        <xsl:element name="client">
                            <xsl:attribute name="cstclavep">
                                <xsl:value-of select="id"/>
                            </xsl:attribute>

                            <xsl:element name="address">

                                <xsl:element name="STREETNAME"><xsl:value-of select="/info/address[streetName]"/></xsl:element>

                            </xsl:element>
                        </xsl:element>
                    </xsl:if>

                    <xsl:if test="@mode='DELETE'">

                    </xsl:if>
            </xsl:for-each>
        </xsl:element>
    </xsl:template>

    <xsl:template match="*" mode="content">
        <xsl:element name="{local-name()}">
            <xsl:copy-of select="@*" />
            <xsl:apply-templates  mode="content"/>
        </xsl:element>       
    </xsl:template>

    <xsl:template match="text()" mode="content">
        <xsl:value-of select="." />
    </xsl:template>    
</xsl:stylesheet>

这是现在的结果:

    <?xml version="1.0" encoding="utf-8"?><clients xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="setClients.xsd" encryptedData="N"><client cstclavep="7451"><address><STREETNAME><streetName>MARKT</streetName><streetName>CHAUSSEE DU PONT DU SART</streetName><streetName>TORHOUTSEBAAN</streetName><streetName>KAAI</streetName><streetName>JEZUSSTRAAT</streetName><streetName>JEZUSSTRAAT</streetName></STREETNAME></address></client><client cstclavep="7451"><address><STREETNAME><streetName>MARKT</streetName><streetName>CHAUSSEE DU PONT DU SART</streetName><streetName>TORHOUTSEBAAN</streetName><streetName>KAAI</streetName><streetName>JEZUSSTRAAT</streetName><streetName>JEZUSSTRAAT</streetName></STREETNAME></address></client></clients>

这就是我需要的

    <?xml version="1.0" encoding="utf-8"?><clients xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="setClients.xsd" encryptedData="N">
    <client cstclavep="7451"><address><STREETNAME>MARKT</STREETNAME></address></client>
    <client cstclavep="7451"><address><STREETNAME>JEZUSTRAAT</STREETNAME></address></client>
    </clients>

实际上,它将所有地址值都放入一个客户端中。我想将当前地址值添加到客户端。

能给个解决办法吗?

谢谢

1 个答案:

答案 0 :(得分:0)

您输入的XML看起来不像您使用的XML,但是请尝试使用 my_url,如果您只需要streetName节点的值,而不是地址的整个子树。

我在您的原始xml上使用它并获得正确的结果:

<STREETNAME><xsl:value-of select="xsi:info/xsi:address/xsi:streetName"/></STREETNAME>