使用XSLT更改单个XML标记

时间:2012-09-13 14:35:18

标签: xml xslt tags using

我正在尝试将XML标记从一个事件简单地更改为另一个事物。 我不希望更改xml文件中的任何其他内容。由于技术原因,我必须使用XSLT来执行此操作。

我看过这篇帖子Changing One Tag Name in an XML File Using XSLT,但逻辑似乎并没有起作用。

我的输入XML是这样的,我想要做的就是将Sync打开和关闭标签分别更改为处理打开和关闭标签。

<SyncCodeDefinition xmlns="xxx" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://schema.xxx.com/OAGIS/2 http://schema.xxx.com/2.6.5/OAGIS/BODs/Developer/mytest.xsd" releaseID="9.2">
<ApplicationArea>
<Sender>
  <LogicalID schemeVersionID="12345">lid://xxx.yyy.zzz</LogicalID>
  <ComponentID>test1</ComponentID>
 </Sender>
<CreationDateTime>2012-09-11T17:07:04Z</CreationDateTime>
<BODID>xxxxx</BODID>
</ApplicationArea>
<DataArea>
<Sync>
  <TenantID>xxxx</TenantID>
  <AccountingEntityID>ZZZ</AccountingEntityID>
  <ActionCriteria>
    <ActionExpression actionCode="Add" />
  </ActionCriteria>
</Sync>
<CodeDefinition>
  <DocumentID>
    <ID accountingEntity="ZZZ" variationID="1">TEST001_PRODUCT</ID>
  </DocumentID>
  <DisplayID>TEST001_PRODUCT</DisplayID>
  <Status>
    <Code listID="CodeDefinitionStatus">Open</Code>
  </Status>
  <ListID>PRODUCT</ListID>
  <CodeValue accountingEntity="ZZZ" languageID="en-GB">TEST001</CodeValue>
  <Name languageID="en-GB">new test</Name>
  <Description languageID="en-GB">new test</Description>
</CodeDefinition>
</DataArea>
</SyncCodeDefinition>

这是我的XSLT,但它似乎忽略了替换语句。请帮助:)

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="node()|@*"> 
<xsl:copy> 
<xsl:apply-templates select="node()|@*"/> 
</xsl:copy> 
</xsl:template>
<xsl:template match= 
"Sync[count(.|((//Sync)[1])) = 1]"> 
     <Process> 
   <xsl:apply-templates /> 
    </Process> 
</xsl:template> 
</xsl:stylesheet> 

1 个答案:

答案 0 :(得分:2)

模板匹配表达式未使用<Sync>元素的命名空间。您需要将其更改为:

<xsl:template match= "xxx:Sync[count(.|((//xxx:Sync)[1])) = 1]"> 

并向<xsl:stylesheet>元素添加名称空间声明:

xmlns:xxx="xxx"

这是一个XML常见问题解答。您的XML输入文档在最外层元素上有一个默认的名称空间声明:

xmlns="xxx"

这意味着除非另有说明,否则所有此元素的后代(包括<Sync>)都位于URI为“xxx”的命名空间中。

请记住,XSLT和XPath使用的XML信息模型会忽略名称空间前缀(或缺少名称空间)和声明本身。它们只关心节点所在的命名空间(由其命名空间URI标识)。

还要记住(作为推论)XML输入文档中使用的名称空间前缀与样式表中声明的任何名称空间前缀完全分开。这是有道理的,因为您可以处理多个输入文档,每个文档可能以不同的方式使用相同的前缀(甚至在同一个XML文档中)。

在XSLT 1.0中,无法在匹配模式(或XPath表达式)中指定要用作默认命名空间的命名空间(即,在没有命名空间前缀时使用的命名空间)。因此,您必须为要使用的任何命名空间声明前缀,然后在匹配模式中使用该前缀。如上图所示。