получить значение дочернего узла в цикл foreach - PullRequest
0 голосов
/ 09 октября 2018

Я хочу получить значение дочернего узла в цикле "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 голосов
/ 09 октября 2018

Вы вводите XML не похоже на тот, который вы использовали, но попробуйте с <STREETNAME><xsl:value-of select="xsi:info/xsi:address/xsi:streetName"/></STREETNAME> , если вы хотите только значение узла streetName, а не целое поддерево адреса.

Я использую это наваш оригинальный xml и получите правильный результат:

<?xml version="1.0" 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="/">
    <clients>
        <xsl:attribute name="xsi:noNamespaceSchemaLocation">setClients.xsd</xsl:attribute>
        <xsl:attribute name="encryptedData">N</xsl:attribute>

        <xsl:for-each select="xsi:pointOfSale">
            <xsl:if test="@mode='UPDATE'">
                <client>
                    <xsl:attribute name="cstclavep" select="id"/>
                    <address>
                        <STREETNAME><xsl:value-of select="xsi:info/xsi:address/xsi:streetName"/></STREETNAME>
                    </address>
                </client>
            </xsl:if>
        </xsl:for-each>
    </clients>
</xsl:template>

...