无法在springource IDE中使用xsl拆分xml文件

时间:2014-08-27 19:07:51

标签: xml xslt

我是xsl技术的新手。我要做的是拆分以下文件:

<?xml version="1.0" encoding="UTF-8"?>
<CustomObject xmlns="http://soap.sforce.com/2006/04/metadata">
    <fields>
        <fullName>StageName</fullName>
        <picklist>
            <picklistValues>
                <fullName>Prospecting/Needs/Qualification</fullName>
                <closed>false</closed>
                <default>false</default>
                <forecastCategory>Pipeline</forecastCategory>
                <probability>25</probability>
                <won>false</won>
            </picklistValues>
            <picklistValues>
                <fullName>Proposal/Price Quote</fullName>
                <closed>false</closed>
                <default>false</default>
                <forecastCategory>Pipeline</forecastCategory>
                <probability>40</probability>
                <won>false</won>
            <sorted>false</sorted>
        </picklist>
        <trackFeedHistory>true</trackFeedHistory>
        <trackTrending>false</trackTrending>
        <type>Picklist</type>
    </fields>
    <fields>
        <fullName>Status__c</fullName>
        <externalId>false</externalId>
        <label>Status</label>
        <required>false</required>
        <trackHistory>false</trackHistory>
        <trackTrending>false</trackTrending>
        <type>Text</type>
        <unique>false</unique>
    </fields>
</CustomObject>

以两个不同的文件命名,以后者的每个字段/全名 - 元素命名。所以基本上我想要第一个文件:&#34; StageName.xml&#34; :

<fields>
            <fullName>StageName</fullName>
            <picklist>
                <picklistValues>
                    <fullName>Prospecting/Needs/Qualification</fullName>
                    <closed>false</closed>
                    <default>false</default>
                    <forecastCategory>Pipeline</forecastCategory>
                    <probability>25</probability>
                    <won>false</won>
                </picklistValues>
                <picklistValues>
                    <fullName>Proposal/Price Quote</fullName>
                    <closed>false</closed>
                    <default>false</default>
                    <forecastCategory>Pipeline</forecastCategory>
                    <probability>40</probability>
                    <won>false</won>
                <sorted>false</sorted>
            </picklist>
            <trackFeedHistory>true</trackFeedHistory>
            <trackTrending>false</trackTrending>
            <type>Picklist</type>
        </fields>

和第二个文件:&#34; Status__c.xml&#34;:

<fields>
            <fullName>Status__c</fullName>
            <externalId>false</externalId>
            <label>Status</label>
            <required>false</required>
            <trackHistory>false</trackHistory>
            <trackTrending>false</trackTrending>
            <type>Text</type>
            <unique>false</unique>
        </fields>

我根据stackoverflow中的问题答案编写了以下小脚本:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" 
                xmlns:redirect="http://xml.apache.org/xalan/redirect" 
                extension-element-prefixes="redirect">

    <xsl:output method="xml" indent="yes" />

    <xsl:template match="/root">
        <xsl:apply-templates/>
        <xsl:for-each select="fields">
            <redirect:write file="file_{@id}-output.xml">
                    <xsl:copy-of select="fields"/>
            </redirect:write>
        </xsl:for-each>
    </xsl:template>


</xsl:stylesheet>

我得到的是以下唯一的文件:&#34; Opportunity.out.xml&#34;:

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


        StageName


                Prospecting/Needs/Qualification
                false
                false
                Pipeline
                25
                false


                Proposal/Price Quote
                false
                false
                Pipeline
                40
                false

            false

        true
        false
        Picklist


        Status__c
        false
        Status
        false
        false
        false
        Text
        false

我通过右键单击运行split.xsl文件 - &gt; run as ---&gt; SpringSource中的XSL转换。

我很抱歉提前提出这个问题,但我真的不知道从哪里开始解决这个问题。

提前谢谢。

1 个答案:

答案 0 :(得分:0)

您需要通过在样式表中为其声明前缀,然后使用该前缀来限定元素名称,将输入XML中的命名空间考虑在内。您发布的样本的根目录也不是root,而是CustomObject所以我们需要的是

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" 
                xmlns:redirect="http://xml.apache.org/xalan/redirect" 
                xmlns:df="http://soap.sforce.com/2006/04/metadata"
                extension-element-prefixes="redirect"
                exclude-result-prefixes="df redirect">

    <xsl:output method="xml" indent="yes" />

<xsl:template match="/df:CustomObject"> 
  <xsl:apply-templates/>
  <xsl:for-each select="df:fields">
    <redirect:write file="file_{df:fullName}-output.xml">
      <xsl:copy-of select="."/>
    </redirect:write>
  </xsl:for-each>
</xsl:template>

</xsl:stylesheet>

当我从命令行使用Xalan 2.7 Java运行它时,它会生成输出文件file_StageName-output.xmlfile_Status__c-output.xml

所以你可能更想要<redirect:write file="{df:fullName}-output.xml">。至于如何使用IDE,请使用与该IDE相关的标记标记您的问题,以便希望熟悉它的人可以提供帮助。