无法通过xslt

时间:2016-11-08 12:54:28

标签: xml xslt

我正在尝试使用xslt将xml从一个xml转换为另一个xml,但无法获得错误。

我的意见是:

<?xml version = "1.0"?> 
<queryResponse xmlns="urn:sfobject.sfapi.successfactors.com" xmlns:ns2="urn:fault.sfapi.successfactors.com">
    <result>
        <sfobject>
            <id>1791
            </id>
            <type>CompoundEmployee
            </type>
            <execution_timestamp>2016-11-08T06:38:48.000Z
            </execution_timestamp>
            <version_id>1611P0
            </version_id>
        </sfobject>     
        <sfobject>
            <id>122
            </id>
            <type>Simple
            </type>
            <execution_timestamp>2016-11-08T08:32:18.000Z
            </execution_timestamp>
            <version_id>16120
            </version_id>
        </sfobject>
        <numResults>1
        </numResults>
        <hasMore>true
        </hasMore>
        <querySessionId>5f619648-548a-43ec-8119-627094f927a5
        </querySessionId>
    </result>
</queryResponse>

并且XSLT是:

<?xml version = "1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xsl:template match="result">
        <calls>
            <xsl:for-each select = "sfobject">
                <call>
                    <id>
                        <xsl:value-of select = "id"/>
                    </id>
                    <type>
                        <xsl:value-of select = "type"/>
                    </type>
                </call>
            </xsl:for-each>     
        </calls>
    </xsl:template>
</xsl:stylesheet>

我收到的输出如下:

  

1791 CompoundEmployee 2016-11-08T06:38:48.000Z 1611P0 122简单
  2016-11-08T08:32:18.000Z 16120 1真实   5f619648-548a-43ec-8119-627094f927a5

基本上,我没有获得标签。我打算得到如下输出:

<calls>
  <call>
    <id>123</id>
    <type>CompoundEmployee</type>
  </call>
</calls>

2 个答案:

答案 0 :(得分:0)

您需要在xslt文件中提供命名空间并使用命名空间前缀

访问您的元素

你的xslt文件应该是

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"  
               xmlns:sf="urn:sfobject.sfapi.successfactors.com"
               xmlns:sin="urn:fault.sfapi.successfactors.com" 
               xmlns:xs="http://www.w3.org/2001/XMLSchema" version="1.0"
               exclude-result-prefixes="sf sin xs">
<xsl:output indent="yes" method="xml" />
   <xsl:template match="/sf:queryResponse">
      <calls>
         <xsl:for-each select="sf:result/sf:sfobject">
            <call>
               <id>
                  <xsl:value-of select="sf:id" />
               </id>
               <type>
                  <xsl:value-of select="sf:type" />
               </type>
            </call>
         </xsl:for-each>
      </calls>
   </xsl:template>
</xsl:stylesheet>

答案 1 :(得分:-1)

在XML的第一行

<queryResponse xmlns="urn:sfobject.sfapi.successfactors.com" xmlns:ns2="urn:fault.sfapi.successfactors.com">

将XML默认命名空间设置为

  

的xmlns =&#34;瓮:sfobject.sfapi.successfactors.com&#34;

导致<result>节点真正被视为

<urn:sfobject.sfapi.successfactors.com:result>

节点。所以XSLT中的以下行

<xsl:template match="result">

尝试匹配<result>个节点,但只找到

<urn:sfobject.sfapi.successfactors.com:result> 

XML文件中的节点。因此&#34;不匹配&#34;文字输出。

删除

  

的xmlns =&#34;瓮:sfobject.sfapi.successfactors.com&#34;

从XML文件的第一行解决问题。