2017-02-06 14 views
1

私のXSLファイルのタスクは、テンプレートのソースファイルから属性 'シンボル'値を取得し、それを翻訳ファイルに入れます。両方のファイルのメッセージ番号が一致します。このアップデートは動作しているようですが、どういうわけか名前空間の問題で終わってしまいました。テンプレートファイル、変換ファイル、および結果ファイルがすべて同じ構造を持つ必要があるため、私はなぜ考えていません。XSLのネームスペース、テンプレートXMLファイルの属性値をコピーして翻訳ファイルを更新する

まず、メッセージ要素にxmlns属性を取得していました。いくつかのグーグルの後、私はそれらを取り除く方法を見つけた。しかし今、私は実際にそれが欲しいところで<Area>要素のxmlns属性を取得していません。

なぜこの再ネームスペースが私と連動しないのですか?
どうすれば動作させることができますか?

私のXSLファイル:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" xmlns:aaa="urn:aaa-bbb-ccc" exclude-result-prefixes="aaa"> 
<!-- Transform -s:"translation.xml" -xsl:"merge_files.xsl" -o:"updated_translation.xml" +templateFile="source.xml" -versionmsg:off --> 

    <xsl:output method="xml" version="1.0" indent="yes" encoding="utf-8"/> 
    <xsl:strip-space elements="*"/> 

    <xsl:param name="templateFile"/> 

    <xsl:variable name="templateDoc" select="$templateFile/aaa:Area" /> 
    <xsl:variable name="source" select="/" /> 

    <!-- 
    <xsl:template match="aaa:Area"> 
     <xsl:copy> 
      <xsl:apply-templates select="node()|@*"/> 
     </xsl:copy> 
    </xsl:template> 
    --> 

    <!-- Replacement of the traditional identity rule to avoid getting namespace info in the Message elements. --> 
    <xsl:template match="node()[not(self::*)]"> 
    <xsl:copy> 
     <xsl:apply-templates/> 
    </xsl:copy> 
    </xsl:template> 

    <xsl:template match="*"> 
     <xsl:element name="{local-name()}"> 
     <xsl:apply-templates select="node()|@*"/> 
     </xsl:element> 
    </xsl:template> 

    <xsl:template match="@*"> 
     <xsl:attribute name="{local-name()}"> 
     <xsl:value-of select="."/> 
     </xsl:attribute> 
    </xsl:template> 

    <!-- Getting everything except @symbol from the translation. @symbol is fetched from source/template file. --> 
    <xsl:template match="aaa:Message"> 
     <xsl:variable name="messageNumber" select="@number"/> 
     <Message xmlns:abb="urn:aaa-bbb-ccc" number="{$messageNumber}"> 
      <xsl:apply-templates select="$templateDoc/aaa:Message[@number=$messageNumber]/@symbol"/> 
      <xsl:apply-templates select="node()"/> 
     </Message> 
    </xsl:template> 

</xsl:stylesheet> 

私の入力XMLファイル:

<?xml version="1.0" encoding="utf-8"?> 
<Area areaName="YYY" areaNo="2" lang="en" xmlns="urn:aaa-bbb-ccc"> 
    <Message number="1" symbol="TWINKLE_TWINKLE_LITTLE_STAR"> 
    <Title>Twinkle Twinkle Little Star</Title> 
    <Description>Twinkle, twinkle, little star, How I wonder what you are. Up above the world so high, Like a diamond in the sky.</Description> 
    </Message> 
    <Message number="2" symbol="SPIDER_SONG1"> 
    <Title>Itsy-Bitsy Spider</Title> 
    <Description>The itsy-bitsy spider climbed up the water spout. Down came the rain and washed the spider out.</Description> 
    </Message> 
    <Message number="3" symbol="BLACK_SHEEP"> 
    <Title>Baa, baa, black sheep</Title> 
    <Description>Baa, baa, black sheep, have you any wool? Yes sir, yes sir, three bags full!</Description> 
    </Message> 
</Area> 

私の入力変換ファイル:

<?xml version="1.0" encoding="utf-8"?> 
<Area areaName="YYY" areaNo="2" lang="sv" xmlns="urn:aaa-bbb-ccc"> 
    <Message number="1" symbol="TWINKLE_STAR"> 
    <Title>Blinka lilla stjärna</Title> 
    <Description>Blinka lilla stjärna där, hur jag undrar vad du är. Fjärran lockar du min syn, lik en diamant i skyn.</Description> 
    </Message> 
    <Message number="3" symbol="WHITE_SHEEP"> 
    <Title>Bä, bä, vita lamm</Title> 
    <Description>Bä, bä, vita lamm, har du någon ull? Ja, ja, kära barn, jag har säcken full.</Description> 
    </Message> 
</Area> 

予想される出力:

<?xml version="1.0" encoding="utf-8"?> 
<Area areaName="YYY" areaNo="2" lang="sv" xmlns="urn:aaa-bbb-ccc"> 
    <Message number="1" symbol="TWINKLE_TWINKLE_LITTLE_STAR"> 
     <Title>Blinka lilla stjärna</Title> 
     <Description>Blinka lilla stjärna där, hur jag undrar vad du är. Fjärran lockar du min syn, lik en diamant i skyn.</Description> 
    </Message> 
    <Message number="3" symbol="BLACK_SHEEP"> 
     <Title>Bä, bä, vita lamm</Title> 
     <Description>Bä, bä, vita lamm, har du någon ull? Ja, ja, kära barn, jag har säcken full.</Description> 
    </Message> 
</Area> 
「地域」要素内のxmlnsが欠落しているところ

これは私の出力は、以下のようになります。

<?xml version="1.0" encoding="utf-8"?> 
<Area areaName="YYY" areaNo="2" lang="sv"> 
    <Message number="1" symbol="TWINKLE_TWINKLE_LITTLE_STAR"> 
     <Title>Blinka lilla stjärna</Title> 
     <Description>Blinka lilla stjärna där, hur jag undrar vad du är. Fjärran lockar du min syn, lik en diamant i skyn.</Description> 
    </Message> 
    <Message number="3" symbol="BLACK_SHEEP"> 
     <Title>Bä, bä, vita lamm</Title> 
     <Description>Bä, bä, vita lamm, har du någon ull? Ja, ja, kära barn, jag har säcken full.</Description> 
    </Message> 
</Area> 
+0

をお試しください(間違った)出力、ちょうど問題が何であるか誤解がないでしょうか?ありがとう! –

+0

誤った出力を追加しました。ここでは、xmlnsがAreaエレメントから欠落しています。 – Gunilla

答えて

0

ソースXMLの要素が名前空間内のすべてのです。私は名前空間に新しいMessage要素を作成していたので、あなたの元の問題はだと思うので、出力に<Message xmlns="">と表示されました。あなたが実際にそれを解決しようとすると、実際には望んでいないすべての要素から名前空間が削除されます。

だから、本当にただの要素をコピーするにはアイデンティティーテンプレートを使用する必要が

<xsl:template match="@*|node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
</xsl:template> 

....自分の名前空間を保持するが、正しい名前空間で出力することにMessageテンプレートを変更している...

<xsl:template match="aaa:Message"> 
    <xsl:variable name="messageNumber" select="@number"/> 
    <Message xmlns="urn:aaa-bbb-ccc" number="{$messageNumber}"> 
     <xsl:apply-templates select="$templateDoc/aaa:Message[@number=$messageNumber]/@symbol"/> 
     <xsl:apply-templates select="node()"/> 
    </Message> 
</xsl:template> 

あなたの現在の一例を示すために、あなたはあなたの質問を編集することができ、このXSLT

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" xmlns:aaa="urn:aaa-bbb-ccc" exclude-result-prefixes="aaa"> 
<!-- Transform -s:"translation.xml" -xsl:"merge_files.xsl" -o:"updated_translation.xml" +templateFile="source.xml" -versionmsg:off --> 

    <xsl:output method="xml" version="1.0" indent="yes" encoding="utf-8"/> 
    <xsl:strip-space elements="*"/> 

    <xsl:param name="templateFile"/> 

    <xsl:variable name="templateDoc" select="$templateFile/aaa:Area" /> 
    <xsl:variable name="source" select="/" /> 

    <xsl:template match="@*|node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|node()"/> 
     </xsl:copy> 
    </xsl:template> 

    <!-- Getting everything except @symbol from the translation. @symbol is fetched from source/template file. --> 
    <xsl:template match="aaa:Message"> 
     <xsl:variable name="messageNumber" select="@number"/> 
     <Message xmlns="urn:aaa-bbb-ccc" number="{$messageNumber}"> 
      <xsl:apply-templates select="$templateDoc/aaa:Message[@number=$messageNumber]/@symbol"/> 
      <xsl:apply-templates select="node()"/> 
     </Message> 
    </xsl:template> 

</xsl:stylesheet> 
+0

ありがとう!今、それは最終的に働いています!だから、私は名前空間に新しいメッセージ要素を作成していた...私は参照してください。 – Gunilla

関連する問題