У меня возникают проблемы, когда я переворачиваю голову, преобразуя подмножество атрибутов в дочерние элементы. Моя цель - создать таблицу стилей, на которую может ссылаться SSRS при формировании выходных данных. Пример кода, который я видел, преобразует все атрибуты, и я не могу понять, как быть избирательным. Вот исходный файл, выводимый в виде файла XML из SSRS.
<?xml version="1.0" encoding="utf-8"?>
<Report xsi:schemaLocation="_x0031_4Q_CSV http://MySSRSServer/ReportServer?%2FTRR%20Reports%2F14Q_CSV&rs%3ACommand=Render&rs%3AFormat=XML&rs%3ASessionID=uuurm045z4bsq2maejbbb045&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 уже несколько лет.