我是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转换。
我很抱歉提前提出这个问题,但我真的不知道从哪里开始解决这个问题。
提前谢谢。
答案 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.xml
和file_Status__c-output.xml
。
所以你可能更想要<redirect:write file="{df:fullName}-output.xml">
。至于如何使用IDE,请使用与该IDE相关的标记标记您的问题,以便希望熟悉它的人可以提供帮助。