Копирование различных элементов в переменную на основе логики - XSLT - PullRequest
0 голосов
/ 31 января 2019

Ну, я думаю, этот вопрос будет немного проблематичным, но я оценю любую помощь.У меня есть xml, который выглядит следующим образом:

<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<root xmlns:cd="http://blabla" xmlns:se="http://blahblah">

  <se:Tuple>
    <se:name>AAA</se:name>
    <se:game>a</se:game>
  </se:Tuple>

  <se:Tuple>
    <se:name>BBB</se:name>
    <se:game>b</se:game>
  </se:Tuple>

  <se:Tuple>
    <se:name>CCC</se:name>
    <se:game>c</se:game>
  </se:Tuple>

  <cd:Tuple>
    <cd:name>AAA</cd:name>
    <cd:genre>aaa</cd:genre>
  </cd:Tuple>

  <cd:Tuple>
    <cd:name>CCC</cd:name>
    <cd:genre>ccc</cd:genre>
  </cd:Tuple>

</root>

Я хочу преобразовать (смешать) эти данные с помощью xslt 3.0 и сохранить их в переменной для дальнейшего использования в файле xslt:

  <se:Tuple>
    <se:name>AAA</se:name>
    <se:game>a</se:game>
    <cd:genre>aaa</cd:genre>
  </se:Tuple>

  <se:Tuple>
    <se:name>BBB</se:name>
    <se:game>b</se:game>
  </se:Tuple>

  <se:Tuple>
    <se:name>CCC</se:name>
    <se:game>c</se:game>
    <cd:genre>ccc</cd:genre>
  </se:Tuple>

Логика, стоящая за миксом: скопировать все se: Tuple в переменную.При копировании каждого se: Tuple, если был какой-либо cd: Tuple, его cd: name равно se: name, скопируйте жанр cd: из этого Tuple в se: Tuple.

Огромное спасибо:)

Ответы [ 3 ]

0 голосов
/ 31 января 2019

Выглядит как очень простая проблема объединения, например

<xsl:template match="se:Tuple">
  <xsl:copy>
    <xsl:copy-of select="*"/>
    <xsl:copy-of select="../cd:Tuple[cd:name=current()/se:name]/cd:genre"/>
  </xsl:copy>
</xsl:template>
0 голосов
/ 31 января 2019

Благодаря ответам Мартина Хоннена и Майкла Кея у меня сработал следующий код:

    <xsl:template match="se:Tuple">
         <xsl:copy>
             <xsl:copy-of select="*"/>
             <xsl:copy-of select="../cd:Tuple[cd:name=current()/se:name]/cd:genre"/>
         </xsl:copy>
    </xsl:template>

    <xsl:template match="root">
        <xsl:variable name="temp1">
            <xsl:copy>
                <xsl:apply-templates select="se:Tuple"/>
            </xsl:copy>
        </xsl:variable>
    <xsl:copy-of select="$temp1"/>
  </xsl:template>

Я надеюсь, что ошибок при наборе нет, поскольку мои собственные имена элементов отличаются.

0 голосов
/ 31 января 2019

Это похоже на простую проблему группировки или перекрестной ссылки, в зависимости от того, может ли быть cd:Tuple с cd:name, которого нет ни в одном se:Tuple.Если их нет, вы можете просто сгруппировать <xsl:for-each-group select="se:Tuple, cd:Tuple" group-by="se:name, cd:name">, в противном случае использовать ключ <xsl:key name="cd-tuple-ref" match="cd:Tuple" use="cd:name"/>, а затем обработать любой se:Tuple и скопировать key('cd-tuple-ref', se:name)/cd:genre.

...