Преобразование XSLT неправильно - PullRequest
0 голосов
/ 06 апреля 2020

Ниже мой XSLT, и мне нужно рассмотреть все теги "Table" из XML, в которых текст "XYZ".

<xsl:template match="/">
    <xsl:element name="Root">
      <xsl:apply-templates select= "Document"/>
    </xsl:element>
  </xsl:template>

  <xsl:template match="//Table[.//TH[contains(text(), 'XYZ')]]">
    <xsl:copy-of select="spext:Converter(., 'true', './TR[5]', '2')"/>
  </xsl:template>

Ниже мой фрагмент Input XML. Это вызовет метод в c# для извлечения определенных c тегов из элемента "Table", переданного XSLT.

<Document>
  <Table>
    <TR>
      <TH>
        XYZ
      </TH>
      <TH>
        PQR
      </TH>
    </TR>
    <TR>
      <TD>
        Test data 1
      </TD>
      <TD>
        Test data 1
      </TD>
    </TR>
  </Table>
  <Part>
    <p>Hello World! This is some random text!</p>
  </Part>
  <Part>
    <Table>
      <TR>
        <TH>
          XYZ
        </TH>
        <TH>
          PQR
        </TH>
      </TR>
      <TR>
        <TD>
          Test data 3
        </TD>
        <TD>
          Test data 4
        </TD>
      </TR>
    </Table>
    <p>Random Test after!</p>
  </Part>
</Document>

Мой фактический результат преобразования ниже

<Root>
  <Table>
    <XYZ>Test data 1</XYZ>
    <PQR>Test data 2</PQR>
  </Table>Hello World! This is some random text!
  <Table>
    <XYZ>Test data 3</XYZ>
    <PQR>Test data 4</PQR>
  </Table>Random Test after!
</Root>

Но желательно выходные данные должны быть ниже

<Root>
  <XYZ>
       Test data 1
  </XYZ>
  <PQR>
       Test data 2
  </PQR>
  <XYZ>
       Test data 3
  </XYZ>
  <PQR>
       Test data 4
  </PQR>
</Root>

XSLT должен рассматривать только элементы «Таблицы», но здесь текст других тегов также трансформируется и, таким образом, XML формируется неправильно. enter code here Любая помощь приветствуется. !

1 Ответ

0 голосов
/ 06 апреля 2020

Подход чистого XSLT для преобразования представленной входной выборки в желаемую выходную выборку будет

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

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

  <xsl:template match="Document">
      <Root>
          <xsl:apply-templates select="//Table[TR/TH[contains(., 'XYZ')]]/TR[TD]"/>
      </Root>
  </xsl:template>

  <xsl:template match="TR">
      <xsl:apply-templates select="TD"/>
  </xsl:template>

  <xsl:template match="TD">
      <xsl:param name="pos" select="position()"/>
      <xsl:element name="{normalize-space(../../TR[1]/TH[$pos])}">
          <xsl:value-of select="."/>
      </xsl:element>
  </xsl:template>

</xsl:stylesheet>

https://xsltfiddle.liberty-development.net/ehVZvvL

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