XSL转换命名空间怪异

时间:2015-07-14 18:49:39

标签: xml xslt

我有一个生成的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;

感谢

2 个答案:

答案 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>

感谢所有帮助