无法使用XSL

时间:2019-11-22 10:03:28

标签: xml xslt

我有一个需要处理一段XML并找出所有地址和电话元素并打印出来的要求。

我正在使用的XML和XSL可以在这里找到:http://xsltfiddle.liberty-development.net/ncntCSp/2

我可以获取所有地址,但是,我无法获取所有电话号码。它只会打印第一个可用的电话号码。

我得到的当前输出是:

<person:Party>
            <party:Address>
                <add:AddressLine1>101 S PLAZA PL</add:AddressLine1>
                <add:AddressTypeCode>Billing Address</add:AddressTypeCode>
                <add:City>ABSECON</add:City>
                <add:State>NJ</add:State>
                <add:PostalCode>08201-1306</add:PostalCode>
            </party:Address>
            <party:Phone>
                <phn:PhoneNumber>952-7041821</phn:PhoneNumber>
                <phn:Extension/>
                <phn:PhoneType>Billing Phone</phn:PhoneType>
            </party:Phone>
            <party:Address>
                <add:AddressLine1>101 S PLAZA PL</add:AddressLine1>
                <add:AddressTypeCode>Home Address</add:AddressTypeCode>
                <add:City>ABSECON</add:City>
                <add:State>NJ</add:State>
                <add:PostalCode>08201-1306</add:PostalCode>
            </party:Address>
            <party:Phone>
                <phn:PhoneNumber>952-7041821</phn:PhoneNumber>
                <phn:Extension/>
                <phn:PhoneType>Billing Phone</phn:PhoneType>
            </party:Phone>
        </person:Party>

在party:Phone下的两个地方都有相同的电话号码和类型。但是我需要同时打印手机和类型。类似于以下内容:

<person:Party>
                <party:Address>
                    <add:AddressLine1>101 S PLAZA PL</add:AddressLine1>
                    <add:AddressTypeCode>Billing Address</add:AddressTypeCode>
                    <add:City>ABSECON</add:City>
                    <add:State>NJ</add:State>
                    <add:PostalCode>08201-1306</add:PostalCode>
                </party:Address>
                <party:Phone>
                    <phn:PhoneNumber>952-7041821</phn:PhoneNumber>
                    <phn:Extension/>
                    <phn:PhoneType>Billing Phone</phn:PhoneType>
                </party:Phone>
                <party:Address>
                    <add:AddressLine1>101 S PLAZA PL</add:AddressLine1>
                    <add:AddressTypeCode>Home Address</add:AddressTypeCode>
                    <add:City>ABSECON</add:City>
                    <add:State>NJ</add:State>
                    <add:PostalCode>08201-1306</add:PostalCode>
                </party:Address>
                <party:Phone>
                    <phn:PhoneNumber>952-7041822</phn:PhoneNumber>
                    <phn:Extension/>
                    <phn:PhoneType>Home Phone</phn:PhoneType>
                </party:Phone>
            </person:Party>

如果有人可以共享如何获取所有电话号码及其相应类型的打印逻辑,这将非常有帮助。并且Billing Phone的详细信息应位于Billing Address party:Address块下,Home Phone的详细信息也应遵循并位于Home Address party:Address块下< / p>

注意:为简便起见,我已在给定<xsl:variable name="memberId" select="'2cd76ea8-825c-432e-af6d-92a133fb8fc0'"/>的XSL中对memberId进行了硬编码。 但是,在实际情况下,我将获取XML中所有可用的memberId,并对它们进行相同的逻辑处理以获取电话号码和类型。

1 个答案:

答案 0 :(得分:0)

考虑以下(非常多)简化示例:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:json="http://www.ibm.com/xmlns/prod/2009/jsonx"
exclude-result-prefixes="json">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

<xsl:template match="/json:object">
    <parties>
        <xsl:apply-templates select=".//json:array[@name='contacts']"/>
    </parties>
</xsl:template>

<xsl:template match="json:array[@name='contacts']">
    <party id="{.//json:string[@name='contactId']}">
        <billing>
            <xsl:apply-templates select=".//json:array[@name='addresses']/json:object[json:string[@name='addressType']='Billing Address']" mode="address"/>
            <xsl:apply-templates select=".//json:array[@name='phones']/json:object[json:string[@name='phoneType']='Billing Phone']" mode="phone"/>
        </billing>
        <home>
            <xsl:apply-templates select=".//json:array[@name='addresses']/json:object[json:string[@name='addressType']='Home Address']" mode="address"/>
            <xsl:apply-templates select=".//json:array[@name='phones']/json:object[json:string[@name='phoneType']='Home Phone']" mode="phone"/>
        </home>
    </party>
</xsl:template>

<xsl:template match="json:object" mode="address">
    <address>
        <xsl:apply-templates select="json:string"/>
    </address>
</xsl:template>

<xsl:template match="json:object" mode="phone">
    <phone>
        <xsl:apply-templates select="json:string"/>
    </phone>
</xsl:template>

<xsl:template match="json:string">
    <xsl:element name="{@name}">
        <xsl:value-of select="." />
    </xsl:element>
</xsl:template>

</xsl:stylesheet>

演示http://xsltfiddle.liberty-development.net/ncntCSp/4