Handel命名空间在body内部的两个标签之间定义 - xslt

时间:2016-08-11 09:42:06

标签: xml xslt soap

xml:

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<soap:Body>
  <GetDataResponse xmlns="http://example.com/webservices/">
     <GetDataResult>
        <diffgr:diffgram xmlns:msdata="urn:schemas-abc-com:xml-msdata" xmlns:diffgr="urn:schemas-abc-com:xml-diffgram-v1">
           <CompListData xmlns="">
              <Table diffgr:id="Table1" msdata:rowOrder="0" diffgr:hasChanges="inserted">
                 <Comp>JL-C</Comp>
                 <Type>JOB</Type>
                 <Cost>Lakhs</Cost>
              </Table>
              <Table diffgr:id="Table2" msdata:rowOrder="1" diffgr:hasChanges="inserted">
                 <Comp>JL-C1</Comp>
                 <Type>JOB1</Type>
                 <Cost>Lakhs</Cost>
              </Table>
           </CompListData>
       </diffgr:diffgram>
     </GetDataResult>
  </GetDataResponse>
</soap:Body>
</soap:Envelope>

xslt:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="s xsi xsd ">
<xsl:output method="xml" indent="yes"></xsl:output>
<xsl:strip-space elements="*" />
<xsl:template match="/">

    <xsl:if test="s:Envelope/s:Body/GetDataResponse/GetDataResult/diffgr/CompListData/TableTable[@id='Table1']/Type">
        <JobType1>
            <xsl:value-of
                select="s:Envelope/s:Body/GetDataResponse/GetDataResult/diffgr/CompListData/TableTable[@id='Table1']/Type"></xsl:value-of>
        </JobType1>
    </xsl:if>
<xsl:if test="s:Envelope/s:Body/GetDataResponse/GetDataResult/diffgr/CompListData/TableTable[@id='Table2']/Type">
        <JobType2>
            <xsl:value-of
                select="s:Envelope/s:Body/GetDataResponse/GetDataResult/diffgr/CompListData/TableTable[@id='Table2']/Type"></xsl:value-of>
        </JobType2>
    </xsl:if>
</xsl:template>
</xsl:stylesheet>

我得到的输出是xslt的第一行

<?xml version="1.0" encoding="UTF-8"?>

有人可以指导我如何处理正文中的'diffgr:diffgram'并在'JobType'标记中获取'Type'的值。

1 个答案:

答案 0 :(得分:1)

您的XPath表达式有几个缺陷 - 主要是忽略GetDataResponseGetDataResultdiffgram元素的名称空间,以及id属性的名称空间。

你还写了diffgr而不是diffgramTableTable而不是Table

尝试改为:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:w="http://example.com/webservices/"
xmlns:d="urn:schemas-abc-com:xml-diffgram-v1"
exclude-result-prefixes="s w d">
<xsl:output method="xml" version="1.0" encoding="utf-8" indent="yes"/>

<xsl:template match="/">
    <xsl:variable name="jobtype1" select="s:Envelope/s:Body/w:GetDataResponse/w:GetDataResult/d:diffgram/CompListData/Table[@d:id='Table1']/Type" />
    <xsl:variable name="jobtype2" select="s:Envelope/s:Body/w:GetDataResponse/w:GetDataResult/d:diffgram/CompListData/Table[@d:id='Table2']/Type" />
    <xsl:if test="$jobtype1">
        <JobType1>
            <xsl:value-of select="$jobtype1"/>
        </JobType1>
    </xsl:if>
    <xsl:if test="$jobtype2">
        <JobType2>
            <xsl:value-of select="$jobtype2"/>
        </JobType2>
    </xsl:if>
</xsl:template>

</xsl:stylesheet>

并非此处生成的结果不是格式良好的XML文档(没有单个根元素)。