XML XSLT转换问题

时间:2018-06-06 19:59:17

标签: xml xslt

我一直在尝试使用xslt转换我的xml,它让我疯狂。

这是XML,

<env:Body xmlns:env="http://schemas.xmlsoap.org/soap/envelope/">
<items xmlns="http://ws.apache.org/ns/synapse">
    <profiles>
        <candidate_details>
            <application>
                <app_id>ABC</app_id>
                <position_id>RR</position_id>
            </application>
        </candidate_details>
        <candidate_details>
            <application>
                <app_id>ABC2</app_id>
                <position_id>RR2</position_id>
            </application>
        </candidate_details>
    </profiles>
</items>
</env:Body>

这是XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"   xmlns:env="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="no"/>  
<xsl:template match="env:Body/items/profiles">

    <xsl:for-each select="candidate_details">

            <application>  
                <app_id> <xsl:value-of select='application/app_id' /> </app_id>
            </application>

    </xsl:for-each> 

</xsl:template>

</xsl:stylesheet>

我的预期输出是

<application>
    <app_id>
        ABC
    </app_id>
</application>
<application>
    <app_id>
        ABC2
    </app_id>
</application>

根本没有打印出这种格式,只有价值,我做错了什么?请帮忙。谢谢!

PS。我知道

<items xmlns="http://ws.apache.org/ns/synapse">

是无效的命名空间,但那是xml的来源,所以我必须使用这个xml作为输入。

1 个答案:

答案 0 :(得分:0)

需要调整一些事情

  • 明确添加所有名称空间
  • 从输出中排除它们
  • 在根元素
  • 处捕获模板

如下:

<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"   
    xmlns:env="http://schemas.xmlsoap.org/soap/envelope/"
    xmlns:s="http://ws.apache.org/ns/synapse"
    exclude-result-prefixes="s env" 
>
<xsl:output  method="xml" omit-xml-declaration="yes"  indent="yes" />
<xsl:template match="/env:Body">
<xsl:for-each select="s:items/s:profiles/s:candidate_details">
<application>
    <app_id>
       <xsl:value-of select='s:application/s:app_id' /> 
    </app_id>
</application>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>