合并2个XML文件,合并密钥并将其作为模板应用

时间:2010-09-10 08:37:39

标签: xml xslt

我必须提交XML文件: language.xml menu.xml 。默认情况下会加载第一个,第二个加载<xsl:param />

language.xml:

<?xml version="1.0" encoding="utf-8"?>
<language>
    <header>
        <menu>
            <title>Title of example</title>
        </menu>
        <menu>
            <title>Title of example 2</title>
        </menu>
        <menu>
            <title>Title of example 3</title>
        </menu>
    </header>
</language>

menu.xml文件

<?xml version="1.0" encoding="utf-8"?>
<header>
    <menu>
        <a>/example</a>
    </menu>
    <menu>
        <a>/example2</a>
    </menu>
    <menu>
        <a>/example3</a>
    </menu>
</header>

我需要将每个/语言/标题/菜单与每个/标题/菜单相匹配。位置是正确的,因此第一个/语言/标题/菜单与/ header / menu对应。

所以期望的输出将是:

<a href="/example">Title of example</a>
<a href="/example2">Title of example 2</a>
<a href="/example3">Title of example 3</a>

谢谢!

2 个答案:

答案 0 :(得分:2)

使用匹配模板,您可以执行以下操作:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes"/>

  <xsl:variable name="localization" select="document('index.en.xml')" />
  <xsl:strip-space elements="*"/>

  <xsl:template match="/">
    <html>
      <head>
        <title>Test</title>
      </head>
      <body>
        <xsl:apply-templates />
      </body>
    </html>
  </xsl:template>

  <xsl:template match="menu">
    <a href="{a}">
      <xsl:variable name="pos" select="position()" />
      <xsl:value-of select="$localization/language/header/menu[$pos]/title"/>
    </a>
  </xsl:template>

</xsl:stylesheet>

答案 1 :(得分:0)

据我所知,你说文件应该根据它们作为XML子节点的位置进行链接。在这种情况下,您需要类似的东西:

<xsl:for-each select="menu">
  <a href="{.}">
    <xsl:variable name="position"><xsl:value-of select="position()"/></xsl:variable>
    <xsl:for-each select="$param//menu[position() = $position]">
      <xsl:value-of select="title"/>
    </xsl:for-each>
  </a>
</xsl:for-each>