Объединить 2 XML-файла, объединить ключи и применить его в качестве шаблона - PullRequest
0 голосов
/ 10 сентября 2010

У меня есть файлы 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>

Мне нужно сопоставить каждый / язык / заголовок / меню с каждым / заголовок / меню. Позиции правильные, поэтому первое / language / header / menu соответствует /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 ]

2 голосов
/ 10 сентября 2010

Используя шаблоны матчей, вы можете сделать следующее:

<?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>
0 голосов
/ 10 сентября 2010

Из того, что я понимаю, вы говорите, что файлы должны быть связаны на основе их положения как дочерних узлов 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...