xml - XSL 中的命名空间,从模板 XML 文件复制属性值以更新翻译文件

标签 xml xslt namespaces xslt-1.0 xml-namespaces

我的 XSL 文件的任务是从模板源文件中获取属性“符号”值,并将其放入已翻译的文件中,其中两个文件中的消息编号匹配。此更新似乎有效,但不知何故我最终遇到了命名空间问题。我不知道为什么,因为模板文件、翻译文件和生成的文件都应该具有完全相同的结构。

首先,我收到了 xmlns Message 元素中的属性。经过一番谷歌搜索后,我找到了摆脱它们的方法。但现在我没有收到 xmlns <Area> 中的属性元素,我真正想要的地方。

为什么这种重命名空间对我不起作用?
我怎样才能让它工作?

我的 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>

最佳答案

源 XML 中的元素都在一个命名空间中。我认为您描述的原始问题是因为您正在创建新的 Message没有命名空间的元素,因此它们在输出中显示为 <Message xmlns=""> .您试图解决它实际上从所有元素中删除了 namespace ,这并不是真正想要的。

所以,真的只需要使用身份模板来复制元素并保留它们的命名空间....

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

关于xml - XSL 中的命名空间,从模板 XML 文件复制属性值以更新翻译文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42072101/

相关文章:

c# - Visual Basic.NET 与 C# 中命名空间的区别以及如何处理它们

sql-server - 从数据库中检索数据时如何转义特殊字符?

C# 文档 - 用户定义的标签

python - 如何使用python将嵌套子节点添加到xml文档中的父节点?

iphone - iPhone 上的图片链接不可点击

node.js - 使用纯 JS 在 Node.js 中进行 XML 转换?

XML 两个同名标签

xslt - 使用参数调用xslt模板

c# - (约定)C# 类名

python - 如何使用scrapy的XmlFeedSpider解析sitemap.xml文件?