【问题标题】:XSL Transformation parse same names columnXSL 转换解析同名列
【发布时间】:2018-03-28 05:30:18
【问题描述】:

我有xml:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <soapenv:Body>
        <processOCIMessageResponse xmlns="urn:com:broadsoft:webservice">
            <processOCIMessageReturn><![CDATA[<?xml version="1.0" encoding="ISO-8859-1"?>
                <MyDocument protocol="OCI" xmlns="C" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
                    <sessionId xmlns="">12345</sessionId>
                    <command echo="" xsi:type="AuthenticationResponse" xmlns="">
                        <userId>user_test</userId>
                    </command>
                    <command echo="" xsi:type="ServiceProvider" xmlns="">
                        <ProviderTable>
                            <colHeading>Service Provider Id</colHeading>
                            <colHeading>Service Provider Name</colHeading>
                            <colHeading>Is Enterprise</colHeading>
                            <row><col>7163939_id</col><col/><col>true</col></row>
                            <row><col>3134473_build</col><col/><col>true</col></row>
                            <row><col>11421427_group</col><col/><col>true</col></row>
                        </ProviderTable>
                    </command>
                    </MyDocument>]]>
            </processOCIMessageReturn>
        </processOCIMessageResponse>
    </soapenv:Body>
</soapenv:Envelope>

如何从 col 标签中提取值?因为标签在一行中重复了好几次。

这是我目前所拥有的:

<xsl:for-each select="./command/ProviderTable/row">
    <xsl:element name="SERVICE_PROVIDER">
        <SERVICE_PROVIDER_ID>
            <xsl:value-of select="col"/>
        </SERVICE_PROVIDER_ID>
        <SERVICE_PROVIDER_NAME>
            <xsl:value-of select="col"/>
        </SERVICE_PROVIDER_NAME>
        <IS_ENTERPRISE>
            <xsl:value-of select="col">
        </IS_ENTERPRISE>
    </xsl:element>
</xsl:for-each>

预期输出

<?xml version="1.0"?>
<main>
    <ProviderTable>
        <SERVICE_PROVIDER_ID>7163939_id</SERVICE_PROVIDER_ID>
        <SERVICE_PROVIDER_NAME></SERVICE_PROVIDER_NAME>
        <IS_ENTERPRISE>true</IS_ENTERPRISE>
    </ProviderTable>
    <ProviderTable>
        <SERVICE_PROVIDER_ID>3134473_build</SERVICE_PROVIDER_ID>
        <SERVICE_PROVIDER_NAME></SERVICE_PROVIDER_NAME>
        <IS_ENTERPRISE>true</IS_ENTERPRISE>
    </ProviderTable>
    <ProviderTable>
        <SERVICE_PROVIDER_ID>11421427_group</SERVICE_PROVIDER_ID>
        <SERVICE_PROVIDER_NAME></SERVICE_PROVIDER_NAME>
        <IS_ENTERPRISE>true</IS_ENTERPRISE>
    </ProviderTable>
</main>

【问题讨论】:

  • 请添加预期的输出。
  • 7163939_idtrue3134473_buildtrue11421427_grouptrue

标签: xml xslt soap cdata envelope


【解决方案1】:

如果每个&lt;row&gt;&lt;col&gt; 元素的数量始终为3,则可以使用index&lt;col&gt; 元素来访问这些值。 XSLT 中的索引从1 开始,即col[1]col[2] 等等。

&lt;xsl:for-each&gt; 可以修改如下。

<xsl:for-each select="./command/ProviderTable/row">
    <xsl:element name="SERVICE_PROVIDER">
        <SERVICE_PROVIDER_ID>
            <xsl:value-of select="col[1]"/>
        </SERVICE_PROVIDER_ID>
        <SERVICE_PROVIDER_NAME>
            <xsl:value-of select="col[2]"/>
        </SERVICE_PROVIDER_NAME>
        <IS_ENTERPRISE>
            <xsl:value-of select="col[3]">
        </IS_ENTERPRISE>
    </xsl:element>
</xsl:for-each>

【讨论】:

  • 什么不起作用?请分享整个 XSLT,这将使您了解您正在尝试什么。
  • 没有工作 col[1] 等...模板太长。有错误:Array ( [type] =&gt; 2 [message] =&gt; XSLTProcessor::transformToXml(): No stylesheet associated to this object [file] =&gt; /var/www/html/online-toolz.com/functions/XSLT.php [line] =&gt; 26 ) Error:XSLTProcessor::transformToXml(): No stylesheet associated to this object
猜你喜欢
  • 2012-01-06
  • 1970-01-01
  • 2022-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-24
  • 2018-03-25
  • 1970-01-01
相关资源
最近更新 更多