xslt apply-template 具有 2 个不同的 XML 具有相同结构的文件

xslt apply-template with 2 different XML files with same structure

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

如何从同一 <div>

中的两个 XML 文件获取值

在具有高阶函数支持的 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>

您当然可以使用例如<xsl:param name="en-doc" select="doc('english-data.xml')"/>.

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

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