【问题标题】:xslt apply-template with 2 different XML files with same structure具有相同结构的 2 个不同 XML 文件的 xslt 应用模板
【发布时间】:2021-05-08 15:59:07
【问题描述】:

我有 2 个用于法语和英语的 xml 文件来生成 HTML。我正在使用 xslt document() 函数访问英文 XML 的内容。

XML 1 法语

<?xml version="1.0" encoding="UTF-8"?>
<Root>
    <group-container>
        <group-name>Comptes</group-name>
    </group-container>
    <group-container>
        <group-name>Paiements</group-name>
    </group-container>
        <group-container>
        <group-name>Cartes</group-name>
    </group-container>  
</Root>

XML 2 英语

<?xml version="1.0" encoding="UTF-8"?>
<Root>
    <group-container>
        <group-name>Accounts</group-name>
    </group-container>
    <group-container>
        <group-name>Payments</group-name>
    </group-container>
        <group-container>
        <group-name>cards</group-name>
    </group-container>  
</Root>

我的 XSLT 是

<xsl:variable name="en-xml-analytics">
    <xsl:value-of select="//path to XML 2 English "/>
</xsl:variable>
<xsl:template match="Root">
    <div class="first-level-inner">
        <xsl:apply-templates select="./group-container" mode="first-level" />
    </div>
</xsl:template>

<xsl:template match="group-container" mode="first-level">
    <div>
        <span>
            <xsl:for-each select="document($en-xml-analytics)/Root/group-container">
                <xsl:attribute name="data-webanalytics">menunavigation.<xsl:value-of select="./group-name" />
                </xsl:attribute>            
            </xsl:for-each>             
            <span>
                <xsl:value-of select="group-name" />
            </span>
        </span>
    </div>
</xsl:template>

预期输出

<div class="first-level-inner">
   <div><span data-webanalytics="menunavigation.Accounts"><span>Comptes</span></span></div>
   <div><span data-webanalytics="menunavigation.Payments"><span>Paiements</span></span></div>
   <div><span data-webanalytics="menunavigation.cards"><span>Cartes</span></span></div>
</div>

如何从同一 &lt;div&gt; 内的两个 XML 文件中获取值

【问题讨论】:

  • 根据group-container 在根元素中的位置,法语和英语值有何关联?
  • 究竟是哪个 XSLT 处理器?如今,对于 Saxon 10 和 XSLT 3,这对于 for-each-pairxsl:merge 来说似乎是一项不错的工作。
  • @MartinHonnen,是的,```group-container``的位置在法语和英语中完全一样,处理器是&lt;xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"&gt;
  • 这是您的 XSLT 代码,您使用哪个软件来运行该代码?

标签: xml xslt xslt-1.0 xslt-2.0


【解决方案1】:

在支持高阶函数的 XSLT 3 中(例如 Saxon HE 10 或更高版本、Saxon 9.8 PE 或 EE 或更高版本、Saxon-JS 2、Altova XML 2017 R3 及更高版本),这可能是for-each-pair 的工作:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  version="3.0"
  xmlns:xs="http://www.w3.org/2001/XMLSchema"
  xmlns:mf="http://example.com/mf"
  exclude-result-prefixes="#all"
  expand-text="yes">

  <xsl:param name="en-doc">
<Root>
    <group-container>
        <group-name>Accounts</group-name>
    </group-container>
    <group-container>
        <group-name>Payments</group-name>
    </group-container>
        <group-container>
        <group-name>cards</group-name>
    </group-container>  
</Root>    
  </xsl:param>
  
  <xsl:output method="html" indent="yes"/>
  
  <xsl:function name="mf:merge" as="element(div)">
    <xsl:param name="container1" as="element(group-container)"/>
    <xsl:param name="container2" as="element(group-container)"/>
    <div>
        <span data-web-analytics="menunavigation.{$container2/group-name}">
            <span>
                <xsl:value-of select="$container1/group-name" />
            </span>
        </span>
    </div>    
  </xsl:function>
  
  <xsl:template match="Root">
      <div class="first-level-inner">
          <xsl:sequence select="for-each-pair(group-container, $en-doc/Root/group-container, mf:merge#2)"/>
      </div>
  </xsl:template>
  
</xsl:stylesheet>

您当然可以使用例如内联数据而不是内联数据&lt;xsl:param name="en-doc" select="doc('english-data.xml')"/&gt;.

对于您的原始代码,它应该可以使用存储在变量中的位置,例如

<xsl:template match="group-container" mode="first-level">
    <xsl:variable name="pos" select="position()"/>
    <div>
        <span data-webanalytics="menunavigation.{document($en-xml-analytics)/Root/group-container[$pos]/group-name}">         
            <span>
                <xsl:value-of select="group-name" />
            </span>
        </span>
    </div>
</xsl:template>

【讨论】:

  • 我认为是撒克逊专业版。不完全确定。不幸的是,不支持 XSLT 3.0。你能帮我看看如何用 XSLT 2.0 来做这件事吗?
  • @user2628187,我已经在答案的末尾这样做了。
  • 我有点迷失了第二级,没有得到所需的结果。如果我有二级,你能帮我处理吗?由于已关闭,因此我打开了一个新线程stackoverflow.com/questions/67452580/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多