SSRS XSLT для XML вывода - преобразование подмножества атрибутов в элементы - PullRequest
0 голосов
/ 25 января 2020

У меня возникают проблемы, когда я переворачиваю голову, преобразуя подмножество атрибутов в дочерние элементы. Моя цель - создать таблицу стилей, на которую может ссылаться SSRS при формировании выходных данных. Пример кода, который я видел, преобразует все атрибуты, и я не могу понять, как быть избирательным. Вот исходный файл, выводимый в виде файла XML из SSRS.

<?xml version="1.0" encoding="utf-8"?>
<Report xsi:schemaLocation="_x0031_4Q_CSV http://MySSRSServer/ReportServer?%2FTRR%20Reports%2F14Q_CSV&amp;rs%3ACommand=Render&amp;rs%3AFormat=XML&amp;rs%3ASessionID=uuurm045z4bsq2maejbbb045&amp;rc%3ASchema=True" Name="14Q_CSV" textbox1="14Q_CSV Period:201711 Publish Date: 12/7/2017 4:38:49 PM" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="_x0031_4Q_CSV">
  <table1>
    <Detail_Collection>
      <Detail ID_RSSD="1037003" D_DT="2017-11-30T00:00:00" CQSCS383="S0004260053" Transtype="I" CQSCF841="2020-01-23T00:00:00" CQSCP082="CUSIP" CQSCP083="31384YCC8" CQSCS370="N" CQSCP084="Agency MBS" CQSCP085="FN 537467" CQSCP087="50768.00" CQSCP088="53330.00" CQSCP089="50667.00" CQSCP090="12484343.00" CQSCP091="0.00" CQSCP092="AFS" CQSCP093="2017-11-30T00:00:00" CQSCP094="0.070363000000" CQSCP095="2000-04-01T00:00:00" CQSCS371="USD" CQSCHK21="105.2563040000" />
      <Detail ID_RSSD="1037003" D_DT="2017-11-30T00:00:00" CQSCS383="S0004260054" Transtype="I" CQSCF841="2020-01-23T00:00:00" CQSCP082="CUSIP" CQSCP083="31384YCD6" CQSCS370="N" CQSCP084="Agency MBS" CQSCP085="FN 537468" CQSCP087="96069.00" CQSCP088="106433.00" CQSCP089="96069.00" CQSCP090="12066524.00" CQSCP091="0.00" CQSCP092="AFS" CQSCP093="2017-11-30T00:00:00" CQSCP094="0.067115000000" CQSCP095="2000-04-01T00:00:00" CQSCS371="USD" CQSCHK21="110.7884470000" />
      <Detail ID_RSSD="1037003" D_DT="2017-11-30T00:00:00" CQSCS383="S0004260057" Transtype="I" CQSCF841="2020-01-23T00:00:00" CQSCP082="CUSIP" CQSCP083="31384YCH7" CQSCS370="N" CQSCP084="Agency MBS" CQSCP085="FN 537472" CQSCP087="133804.00" CQSCP088="151158.00" CQSCP089="134964.00" CQSCP090="6415504.00" CQSCP091="0.00" CQSCP092="AFS" CQSCP093="2017-11-30T00:00:00" CQSCP094="0.064967000000" CQSCP095="2000-04-01T00:00:00" CQSCS371="USD" CQSCHK21="111.9988700000" />
      <Detail ID_RSSD="1037003" D_DT="2017-11-30T00:00:00" CQSCS383="S0004260058" Transtype="I" CQSCF841="2020-01-23T00:00:00" CQSCP082="CUSIP" CQSCP083="31384YCJ3" CQSCS370="N" CQSCP084="Agency MBS" CQSCP085="FN 537473" CQSCP087="188500.00" CQSCP088="198238.00" CQSCP089="186974.00" CQSCP090="7054878.00" CQSCP091="0.00" CQSCP092="AFS" CQSCP093="2017-11-30T00:00:00" CQSCP094="0.074321000000" CQSCP095="2000-04-01T00:00:00" CQSCS371="USD" CQSCHK21="106.0240080000" />
      <Detail ID_RSSD="1037003" D_DT="2017-11-30T00:00:00" CQSCS383="S0004260059" Transtype="I" CQSCF841="2020-01-23T00:00:00" CQSCP082="CUSIP" CQSCP083="31384YCK0" CQSCS370="N" CQSCP084="Agency MBS" CQSCP085="FN 537474" CQSCP087="53662.00" CQSCP088="56159.00" CQSCP089="52828.00" CQSCP090="6033726.00" CQSCP091="0.00" CQSCP092="AFS" CQSCP093="2017-11-30T00:00:00" CQSCP094="0.079403000000" CQSCP095="2000-04-01T00:00:00" CQSCS371="USD" CQSCHK21="106.3062160000" />
      <Detail ID_RSSD="1037003" D_DT="2017-11-30T00:00:00" CQSCS383="S0004260060" Transtype="I" CQSCF841="2020-01-23T00:00:00" CQSCP082="CUSIP" CQSCP083="31384YCL8" CQSCS370="N" CQSCP084="Agency MBS" CQSCP085="FN 537475" CQSCP087="53958.00" CQSCP088="57002.00" CQSCP089="53518.00" CQSCP090="5710436.00" CQSCP091="0.00" CQSCP092="AFS" CQSCP093="2017-11-30T00:00:00" CQSCP094="0.076705000000" CQSCP095="2000-04-01T00:00:00" CQSCS371="USD" CQSCHK21="106.5098890000" />
    </Detail_Collection>
  </table1>
</Report>

Мне нужно сохранить первые четыре атрибута в узле Detail, переименовать узел, как показано, и преобразовать остальные в дочерние элементы узла Detail.

Вот желаемый результат:


<?xml version="1.0" encoding="UTF-8" standalone="true"?>
<SCRTS_Data_Collect LAST_ASOF_TSTMP="2019-11-06T00:00:00.000" DATA_ASOF_TSTMP="2019-11-06T00:00:00.000">
    <SCRTS_Data_Collect_MS ID_RSSD="1037003" D_DT="2019-09-30T00:00:00" CQSCS383="S0010160276" TRANSTYPE="I">
        <CQSCF841>11/06/2019</CQSCF841>
        <CQSCP082>CUSIP</CQSCP082>
        <CQSCP083>36202K2Q7</CQSCP083>
        <CQSCS370>N</CQSCS370>
        <CQSCP084>Agency MBS</CQSCP084>
        <CQSCP085>G2 8883</CQSCP085>
        <CQSCP087>8917</CQSCP087>
        <CQSCP088>9008</CQSCP088>
        <CQSCP089>8911</CQSCP089>
        <CQSCP090>5200000</CQSCP090>
        <CQSCP091>0</CQSCP091>
        <CQSCP092>AFS</CQSCP092>
        <CQSCP093>09/30/2019</CQSCP093>
        <CQSCP094>0.07108</CQSCP094>
        <CQSCP095>10/07/2000</CQSCP095>
        <CQSCS371>USD</CQSCS371>
        <CQSCHK21>101.090333</CQSCHK21>
    </SCRTS_Data_Collect_MS>
</SCRTS_Data_Collect>

Таблица стилей, над которой я работал, имеет следующий код:


  <!-- rule to copy everything else  xmlns="_x0031_4Q_CSV" -->
  <xsl:template match="*/@*" xmlns="_x0031_4Q_CSV">


    <xsl:element name="{name()}">
    <xsl:value-of select="."/>
    </xsl:element>


  <xsl:apply-templates/>  
  </xsl:template>

Очевидно, это преобразует все из атрибуты к элементам. Я поставил множество путей узлов вместо совпадения * / @, но потом ничего не получаю, так что это явно неправильно.

Заранее извиняюсь, если это не ясно. Я не работал с XSLT уже несколько лет.

1 Ответ

0 голосов
/ 25 января 2020

Какая бы ни была ваша таблица стилей, она не завершена, а ваши выходные данные хорошо объяснены, но для преобразования атрибутов в элементы вы можете преобразовать подобное:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:d="_x0031_4Q_CSV">
  <xsl:template match="node()|@*">
    <xsl:copy>
        <xsl:apply-templates select="node()|@*"/>
    </xsl:copy>
  </xsl:template>
  <xsl:template match="d:Detail">
    <xsl:variable name="white-list" select="@ID_RSSD|@D_DT|@CQSCS383|@Transtype"/>  
    <xsl:copy>
        <xsl:apply-templates select="$white-list"/>
        <xsl:apply-templates select="@*[count(.|$white-list)!=count($white-list)]" 
                             mode="element"/>
        <xsl:apply-templates select="node()"/>
    </xsl:copy>
  </xsl:template>
  <xsl:template match="@*" mode="element">
    <xsl:element name="{name()}">
        <xsl:value-of 
            select="."/>
    </xsl:element>
  </xsl:template>
</xsl:stylesheet>

Вывод:

<Report xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns="_x0031_4Q_CSV"
        xsi:schemaLocation="_x0031_4Q_CSV http://MySSRSServer/ReportServer?%2FTRR%20Reports%2F14Q_CSV&amp;rs%3ACommand=Render&amp;rs%3AFormat=XML&amp;rs%3ASessionID=uuurm045z4bsq2maejbbb045&amp;rc%3ASchema=True"
        Name="14Q_CSV"
        textbox1="14Q_CSV Period:201711 Publish Date: 12/7/2017 4:38:49 PM">
  <table1>
      <Detail_Collection>
         <Detail ID_RSSD="1037003"
                 D_DT="2017-11-30T00:00:00"
                 CQSCS383="S0004260053"
                 Transtype="I">
            <CQSCF841 xmlns="">2020-01-23T00:00:00</CQSCF841>
            <CQSCP082 xmlns="">CUSIP</CQSCP082>
            <CQSCP083 xmlns="">31384YCC8</CQSCP083>
            <CQSCS370 xmlns="">N</CQSCS370>
            <CQSCP084 xmlns="">Agency MBS</CQSCP084>
            <CQSCP085 xmlns="">FN 537467</CQSCP085>
            <CQSCP087 xmlns="">50768.00</CQSCP087>
            <CQSCP088 xmlns="">53330.00</CQSCP088>
            <CQSCP089 xmlns="">50667.00</CQSCP089>
            <CQSCP090 xmlns="">12484343.00</CQSCP090>
            <CQSCP091 xmlns="">0.00</CQSCP091>
            <CQSCP092 xmlns="">AFS</CQSCP092>
            <CQSCP093 xmlns="">2017-11-30T00:00:00</CQSCP093>
            <CQSCP094 xmlns="">0.070363000000</CQSCP094>
            <CQSCP095 xmlns="">2000-04-01T00:00:00</CQSCP095>
            <CQSCS371 xmlns="">USD</CQSCS371>
            <CQSCHK21 xmlns="">105.2563040000</CQSCHK21>
         </Detail>
         <Detail ID_RSSD="1037003"
                 D_DT="2017-11-30T00:00:00"
                 CQSCS383="S0004260054"
                 Transtype="I">
            <CQSCF841 xmlns="">2020-01-23T00:00:00</CQSCF841>
            <CQSCP082 xmlns="">CUSIP</CQSCP082>
            <CQSCP083 xmlns="">31384YCD6</CQSCP083>
            <CQSCS370 xmlns="">N</CQSCS370>
            <CQSCP084 xmlns="">Agency MBS</CQSCP084>
            <CQSCP085 xmlns="">FN 537468</CQSCP085>
            <CQSCP087 xmlns="">96069.00</CQSCP087>
            <CQSCP088 xmlns="">106433.00</CQSCP088>
            <CQSCP089 xmlns="">96069.00</CQSCP089>
            <CQSCP090 xmlns="">12066524.00</CQSCP090>
            <CQSCP091 xmlns="">0.00</CQSCP091>
            <CQSCP092 xmlns="">AFS</CQSCP092>
            <CQSCP093 xmlns="">2017-11-30T00:00:00</CQSCP093>
            <CQSCP094 xmlns="">0.067115000000</CQSCP094>
            <CQSCP095 xmlns="">2000-04-01T00:00:00</CQSCP095>
            <CQSCS371 xmlns="">USD</CQSCS371>
            <CQSCHK21 xmlns="">110.7884470000</CQSCHK21>
         </Detail>
         <Detail ID_RSSD="1037003"
                 D_DT="2017-11-30T00:00:00"
                 CQSCS383="S0004260057"
                 Transtype="I">
            <CQSCF841 xmlns="">2020-01-23T00:00:00</CQSCF841>
            <CQSCP082 xmlns="">CUSIP</CQSCP082>
            <CQSCP083 xmlns="">31384YCH7</CQSCP083>
            <CQSCS370 xmlns="">N</CQSCS370>
            <CQSCP084 xmlns="">Agency MBS</CQSCP084>
            <CQSCP085 xmlns="">FN 537472</CQSCP085>
            <CQSCP087 xmlns="">133804.00</CQSCP087>
            <CQSCP088 xmlns="">151158.00</CQSCP088>
            <CQSCP089 xmlns="">134964.00</CQSCP089>
            <CQSCP090 xmlns="">6415504.00</CQSCP090>
            <CQSCP091 xmlns="">0.00</CQSCP091>
            <CQSCP092 xmlns="">AFS</CQSCP092>
            <CQSCP093 xmlns="">2017-11-30T00:00:00</CQSCP093>
            <CQSCP094 xmlns="">0.064967000000</CQSCP094>
            <CQSCP095 xmlns="">2000-04-01T00:00:00</CQSCP095>
            <CQSCS371 xmlns="">USD</CQSCS371>
            <CQSCHK21 xmlns="">111.9988700000</CQSCHK21>
         </Detail>
         <Detail ID_RSSD="1037003"
                 D_DT="2017-11-30T00:00:00"
                 CQSCS383="S0004260058"
                 Transtype="I">
            <CQSCF841 xmlns="">2020-01-23T00:00:00</CQSCF841>
            <CQSCP082 xmlns="">CUSIP</CQSCP082>
            <CQSCP083 xmlns="">31384YCJ3</CQSCP083>
            <CQSCS370 xmlns="">N</CQSCS370>
            <CQSCP084 xmlns="">Agency MBS</CQSCP084>
            <CQSCP085 xmlns="">FN 537473</CQSCP085>
            <CQSCP087 xmlns="">188500.00</CQSCP087>
            <CQSCP088 xmlns="">198238.00</CQSCP088>
            <CQSCP089 xmlns="">186974.00</CQSCP089>
            <CQSCP090 xmlns="">7054878.00</CQSCP090>
            <CQSCP091 xmlns="">0.00</CQSCP091>
            <CQSCP092 xmlns="">AFS</CQSCP092>
            <CQSCP093 xmlns="">2017-11-30T00:00:00</CQSCP093>
            <CQSCP094 xmlns="">0.074321000000</CQSCP094>
            <CQSCP095 xmlns="">2000-04-01T00:00:00</CQSCP095>
            <CQSCS371 xmlns="">USD</CQSCS371>
            <CQSCHK21 xmlns="">106.0240080000</CQSCHK21>
         </Detail>
         <Detail ID_RSSD="1037003"
                 D_DT="2017-11-30T00:00:00"
                 CQSCS383="S0004260059"
                 Transtype="I">
            <CQSCF841 xmlns="">2020-01-23T00:00:00</CQSCF841>
            <CQSCP082 xmlns="">CUSIP</CQSCP082>
            <CQSCP083 xmlns="">31384YCK0</CQSCP083>
            <CQSCS370 xmlns="">N</CQSCS370>
            <CQSCP084 xmlns="">Agency MBS</CQSCP084>
            <CQSCP085 xmlns="">FN 537474</CQSCP085>
            <CQSCP087 xmlns="">53662.00</CQSCP087>
            <CQSCP088 xmlns="">56159.00</CQSCP088>
            <CQSCP089 xmlns="">52828.00</CQSCP089>
            <CQSCP090 xmlns="">6033726.00</CQSCP090>
            <CQSCP091 xmlns="">0.00</CQSCP091>
            <CQSCP092 xmlns="">AFS</CQSCP092>
            <CQSCP093 xmlns="">2017-11-30T00:00:00</CQSCP093>
            <CQSCP094 xmlns="">0.079403000000</CQSCP094>
            <CQSCP095 xmlns="">2000-04-01T00:00:00</CQSCP095>
            <CQSCS371 xmlns="">USD</CQSCS371>
            <CQSCHK21 xmlns="">106.3062160000</CQSCHK21>
         </Detail>
         <Detail ID_RSSD="1037003"
                 D_DT="2017-11-30T00:00:00"
                 CQSCS383="S0004260060"
                 Transtype="I">
            <CQSCF841 xmlns="">2020-01-23T00:00:00</CQSCF841>
            <CQSCP082 xmlns="">CUSIP</CQSCP082>
            <CQSCP083 xmlns="">31384YCL8</CQSCP083>
            <CQSCS370 xmlns="">N</CQSCS370>
            <CQSCP084 xmlns="">Agency MBS</CQSCP084>
            <CQSCP085 xmlns="">FN 537475</CQSCP085>
            <CQSCP087 xmlns="">53958.00</CQSCP087>
            <CQSCP088 xmlns="">57002.00</CQSCP088>
            <CQSCP089 xmlns="">53518.00</CQSCP089>
            <CQSCP090 xmlns="">5710436.00</CQSCP090>
            <CQSCP091 xmlns="">0.00</CQSCP091>
            <CQSCP092 xmlns="">AFS</CQSCP092>
            <CQSCP093 xmlns="">2017-11-30T00:00:00</CQSCP093>
            <CQSCP094 xmlns="">0.076705000000</CQSCP094>
            <CQSCP095 xmlns="">2000-04-01T00:00:00</CQSCP095>
            <CQSCS371 xmlns="">USD</CQSCS371>
            <CQSCHK21 xmlns="">106.5098890000</CQSCHK21>
         </Detail>
      </Detail_Collection>
  </table1>
</Report>

Обратите внимание: атрибуты должны быть выведены перед любым другим типом узла, метод Кайсиана для исключения.

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