我有一个生成的XML文件,如下所示:
<PublishFACSR xmlns="http://www.ibm.com/maximo" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" creationDateTime="2015-07-14T09:23:24-06:00" transLanguage="EN" baseLanguage="EN" messageID="1436887397443667260" maximoVersion="7 5 20140411-2000 V7511--1" event="1">
<FACSRSet>
<SR action="Replace">
<ACCUMULATEDHOLDTIME>0.0</ACCUMULATEDHOLDTIME>
<ACTLABCOST>0.0</ACTLABCOST>
<ACTLABHRS>0.0</ACTLABHRS>
<TICKETID>SR-35102</TICKETID>
<TICKETUID>39822</TICKETUID>
<URGENCY changed="1">3</URGENCY>
<VENDOR />
<VIRTUALENV>0</VIRTUALENV>
</SR>
</FACSRSet>
</PublishFACSR>
我需要更换:
使用SyncFACSR发布FACSR
SR动作=&#34;替换&#34;使用SR action =&#34; AddChange&#34;
我尝试使用以下XSL
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<!-- This template copies everything that doesn't have a more specific rule -->
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<!-- This template copies and renames PublishMXASSET to SyncMXASSSET -->
<xsl:template match="PublishMXASSET">
<SyncMXASSSET>
<xsl:apply-templates/>
</SyncMXASSSET>
</xsl:template>
</xsl:stylesheet>
它生成了以下输出:
<SyncFACSR creationDateTime="2015-07-14T12:34:19-06:00" transLanguage="EN" baseLanguage="EN" messageID="1436898852543140608" maximoVersion="7 5 20140411-2000 V7511--1" event="1">
<FACSRSet xmlns="http://www.ibm.com/maximo" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<SR action="Replace">
<ACCUMULATEDHOLDTIME>0.0</ACCUMULATEDHOLDTIME>
<ACTLABCOST>0.0</ACTLABCOST>
<ACTLABHRS>0.0</ACTLABHRS>
<TICKETID>SR-35102</TICKETID>
<TICKETUID>39822</TICKETUID>
<URGENCY>3</URGENCY>
<VENDOR />
<VIRTUALENV>0</VIRTUALENV>
</SR>
</FACSRSet>
</SyncFACSR>
最大的问题是名称空间已经下移到FACSRSet。我假设这是生成XML和应用XSL的顺序。
输出应如下所示:
<SyncFACSR xmlns="http://www.ibm.com/maximo" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" creationDateTime="2015-07-14T12:34:19-06:00" transLanguage="EN" baseLanguage="EN" messageID="1436898852543140608" maximoVersion="7 5 20140411-2000 V7511--1" event="1">
<FACSRSet>
<SR action="Replace">
<ACCUMULATEDHOLDTIME>0.0</ACCUMULATEDHOLDTIME>
<ACTLABCOST>0.0</ACTLABCOST>
<ACTLABHRS>0.0</ACTLABHRS>
<TICKETID>SR-35102</TICKETID>
<TICKETUID>39822</TICKETUID>
<URGENCY>3</URGENCY>
<VENDOR />
<VIRTUALENV>0</VIRTUALENV>
</SR>
</FACSRSet>
</SyncFACSR>
有关如何解决的任何想法。
哦,并修复动作=&#34; AddChange&#34;
感谢
答案 0 :(得分:0)
首先,您向我们展示的XSLT 不会产生您所说的输出。
接下来,&#34;最大的问题&#34;您声称的输出不您所说的是:
最大的问题是命名空间已经移到了 FACSRSet。
实际上,这根本不是问题:命名空间声明可以出现在任何地方 - 只要它不在声明元素范围之外使用。
输出的真正的问题是SyncFACSR
元素在无命名空间中,而您的预期输出将其放在"http://www.ibm.com/maximo"
命名空间中 - 与{相同它替换的{1}元素及其所有后代。
要获得预期的结果,您的样式表应该:
PublishFACSR
最后,替换SR动作=&#34;替换&#34;使用SR action =&#34; AddChange&#34;,添加另一个模板:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:max="http://www.ibm.com/maximo"
xsl:exclude-result-prefixes="max">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<!-- identity transform -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="max:PublishFACSR" >
<SyncMXASSSET xmlns="http://www.ibm.com/maximo" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<xsl:apply-templates select="@*|node()"/>
</SyncMXASSSET>
</xsl:template>
</xsl:stylesheet>
答案 1 :(得分:0)
所以,按照michael.hor257k的建议。这是用于转换XML的XSL
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:ibm ="http://www.ibm.com/maximo" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<xsl:template match="ibm:PublishFACSR">
<SyncFACSR xmlns="http://www.ibm.com/maximo">
<xsl:apply-templates select="@*|node()"/>
</SyncFACSR>
</xsl:template>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<!-- exception-->
<xsl:template match="ibm:SR/@action[.='Replace']" >
<xsl:attribute name="action">AddChange</xsl:attribute>
</xsl:template>
</xsl:stylesheet>
感谢所有帮助