1

我正在尝试对 XML 标记从一件事到另一件事进行非常简单的更改。我不想更改 xml 文件中的任何其他内容。出于技术原因,我必须使用 XSLT 来执行此操作。

我看过这篇文章使用 XSLT 在 XML 文件中更改一个标记名称,但逻辑似乎不起作用。

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

<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> 
4

1 回答 1

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 表达式)中指定将哪个名称空间用作默认名称空间(即,当没有名称空间前缀时使用哪个名称空间)。因此,您必须为要使用的任何命名空间声明一个前缀,然后在匹配模式中使用该前缀。如上图所示。

于 2012-09-13T14:51:25.003 回答