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