XSLT принимает 2 XML-файла в качестве входных данных и генерирует выходной XML-файл - PullRequest
4 голосов
/ 22 января 2012

Я пытаюсь сгенерировать выходной XML-файл из основного XML-файла (Input1) на основе данных, доступных в XML-файле решения (Input2).

Мастер-файл

<Level1>

 <Level2>
  <LinkedTo>DATA1</LinkedTo> <!DATA1 in the decision file>
  <Attribute1>1</Attribute1>
  <Attribute2>2</Attribute2>
 </Level2>

 <Level2>
  <LinkedTo>DATA2</LinkedTo>
  <Attribute1>3</Attribute1>
  <Attribute2>4</Attribute2>
 </Level2>

</Level1>

Файл решения:

<TopLevel>
 <DATA1>
  <Available>Y</Available>
 </DATA1>

 <DATA2>
  <Available>N</Available>
 </DATA2>

</TopLevel>

XSLT при обработке должен вывести результирующий файл (на основе ДА или НЕТ в файле решения).

<Level1>
 <Level2>
  <Attribute1>1</Attribute1>
  <Attribute2>2</Attribute2>
 </Level2>
</Level1>

Должен признаться, я никогда раньше не занимался XML, но это необходимо для технико-экономического обоснования. Что должно быть в XSLT? Я могу использовать ваши ответы и расширить концепцию.

Или, если есть альтернатива (python, C #, C, C ++ и т. Д.), Они также приветствуются. Я могу справиться с C / C ++ или любым процедурно-ориентированным языком.

Ответы [ 2 ]

6 голосов
/ 22 января 2012

Используйте функцию document.Передайте URI в XML-код решения, например:

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

  <xsl:template match="Level1">
    <xsl:copy>
      <xsl:apply-templates select="Level2"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="Level2">
    <xsl:if test="document('Decision.xml')/TopLevel/*[
        name() = current()/LinkedTo and Available = 'Y']">
      <xsl:copy>
        <xsl:apply-templates select="*[not(self::LinkedTo)]"/>
      </xsl:copy>
    </xsl:if>
  </xsl:template>

  <xsl:template match="*">
    <xsl:copy-of select="."/>
  </xsl:template>

</xsl:stylesheet>
2 голосов
/ 22 января 2012

В качестве альтернативы предлагаем решение XSLT 2.0, которое можно использовать с процессорами XSLT 2.0, такими как Saxon 9, AltovaXML, XQSharp:

<xsl:stylesheet
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  version="2.0">

<xsl:param name="dec-file" select="'decision.xml'"/>
<xsl:variable name="dec-doc" select="document($dec-file)"/>

<xsl:output indent="yes"/>
<xsl:strip-space elements="*"/>

<xsl:key name="k1" match="TopLevel/*" use="name()"/>

<xsl:template match="@* | node()">
  <xsl:copy>
    <xsl:apply-templates select="@* | node()"/>
  </xsl:copy>
</xsl:template>

<xsl:template match="Level2[key('k1', LinkedTo, $dec-doc)/Available != 'Y']"/>

<xsl:template match="Level2[key('k1', LinkedTo, $dec-doc)/Available = 'Y']/LinkedTo"/>

</xsl:stylesheet>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...