1

XML タグをあるものから別のものに非常に単純に変更しようとしています。xml ファイル内の他のものを変更したくありません。技術的な理由から、これを実行するには XSLT を使用する必要があります。

XSLT を使用して XML ファイル内の 1 つのタグ名を変更するこの投稿を見てきましたが、ロジックが機能していないようです。

私の入力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 ですが、replace ステートメントを無視しているようです。助けてください :)

<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 FAQ です。XML 入力ドキュメントには、最も外側の要素にデフォルトの名前空間宣言があります。

xmlns="xxx"

これは、 を含むこの要素のすべての子孫<Sync>が、特に指定されていない限り、URI が「xxx」である名前空間にあることを意味します。

XSLT と XPath が使用する XML 情報モデルでは、名前空間プレフィックス (またはその欠如) と宣言自体が無視されることに注意してください。ノードがどの名前空間 (その名前空間 URI で識別される) にあるかだけを気にします。

また、(結果として) XML 入力ドキュメントで使用される名前空間プレフィックスは、スタイルシートで宣言された名前空間プレフィックスとは完全に分離されていることを覚えておいてください。複数の入力ドキュメントを処理する可能性があり、それぞれが異なる方法で同じプレフィックスを使用している可能性があるため (同じ XML ドキュメント内であっても)、これは理にかなっています。

XSLT 1.0 では、一致パターン (または XPath 式) でデフォルトの名前空間として使用する名前空間 (名前空間プレフィックスがない場合に使用する名前空間) を指定する方法がありません。そのため、使用する名前空間のプレフィックスを宣言し、そのプレフィックスを一致パターンで使用する必要があります。上記のとおりです。

于 2012-09-13T14:51:25.003 に答える