У меня есть документ XSL-FO. В этом документе много вложенных файлов fo: table. Существует внутренняя таблица fo: table с 9 столбцами и множеством строк, в этом примере первая строка для заголовка таблицы и другие строки от 1 до 20 для содержимого. В приведенном ниже примере вы можете увидеть, что в качестве комментария для каждой таблицы FOPTable (fo: table) указан уникальный идентификатор, но этот идентификатор не всегда одинаков для одной и той же таблицы. Он генерируется случайным образом приложением, которое создает этот документ XSL-FO.
Мой вопрос: я хочу найти таблицу, в которой значение заголовка первого столбца установлено на HEADER_COL1 (это значение всегда одно и то же), в этом примере таблица с идентификатором: 997 (помните, что я не могу искать таблицу в соответствии с этим идентификатор, поскольку он изменяется случайным образом каждый раз, когда приложение создает документ XSL-FO). Как только я нашел желаемую таблицу, я хочу ниже:
Например:
Например, если я хочу вставить этот атрибут для 15-го элемента fo: table-row, как я могу это сделать? Мне нужен параметризованный универсальный метод, который принимает в качестве аргумента число, указывающее fo: table-row, куда поместить этот атрибут.
Я знаю, что могу прочитать документ XSL-FO, используя следующее:
string xmlFile = File.ReadAllText(@"C:\Temp\MyXSLFO.xml");
XmlDocument xdoc = new XmlDocument();
xdoc.LoadXml(xmlFile);
Но после загрузки я понятия не имею, как это сделать.
Примечание: я использую Visual Studio 2008, C# и .NET 3.5.
<?xml version = "1.0" encoding = "ISO-8859-1" ?>
<fo:root xmlns:fo = "http://www.w3.org/1999/XSL/Format">
<fo:page-sequence force-page-count = "no-force" master-reference = "first" initial-page-number = "1">
<fo:flow flow-name = "xsl-region-body">
<!-- begin table FOPTable { id: 987 cur_size: 28.7 prv_size: 20.0 prev: <none> cols: 2 locks: 2 flow:FOPFlow: { type: BodyFlow size:4 region:FOPRegion: { type:3 extent:0.0}} }
-->
<fo:table font-size = "8pt" font-family = "sans-serif" space-before.optimum = "0.05cm" table-layout = "fixed">
</fo:table>
<!-- endof table id FOPTable { id: 987 cur_size: 28.7 prv_size: 20.0 prev: <none> cols: 2 locks: 5 flow:FOPFlow: { type: BodyFlow size:4 region:FOPRegion: { type:3 extent:0.0}} }
-->
<!-- begin table FOPTable { id: 992 cur_size: 28.7 prv_size: 20.0 prev: <none> cols: 2 locks: 2 flow:FOPFlow: { type: BodyFlow size:3 region:FOPRegion: { type:3 extent:0.0}} }
-->
<fo:table font-size = "8pt" font-family = "sans-serif" space-before.optimum = "0.05cm" table-layout = "fixed">
</fo:table>
<!-- endof table id FOPTable { id: 992 cur_size: 28.7 prv_size: 20.0 prev: <none> cols: 2 locks: 4 flow:FOPFlow: { type: BodyFlow size:3 region:FOPRegion: { type:3 extent:0.0}} }
-->
<!-- begin table FOPTable { id: 995 cur_size: 28.7 prv_size: 0.0 prev: <none> cols: 2 locks: 2 flow:FOPFlow: { type: BodyFlow size:2 region:FOPRegion: { type:3 extent:0.0}} }
-->
<fo:table font-size = "8pt" font-family = "sans-serif" space-before.optimum = "0.05cm" table-layout = "fixed">
<!-- begin table FOPTable { id: 996 cur_size: 0.0 prv_size: 20.41 prev: 995 cols: 1 locks: 2 flow:null }
-->
<fo:table font-size = "8pt" font-family = "sans-serif" table-layout = "fixed">
<!-- begin table FOPTable { id: 997 cur_size: 0.0 prv_size: 20.409999999999997 prev: 996 cols: 9 locks: 5 flow:null }
-->
<fo:table font-size = "8pt" font-family = "sans-serif" table-layout = "fixed">
<fo:table-column column-width = "2.87cm" />
<fo:table-column column-width = "2.87cm" />
<fo:table-column column-width = "2.87cm" />
<fo:table-column column-width = "4.709999999999996cm" />
<fo:table-column column-width = "2.87cm" />
<fo:table-column column-width = "3.9cm" />
<fo:table-column column-width = "2.87cm" />
<fo:table-column column-width = "2.87cm" />
<fo:table-column column-width = "2.87cm" />
<fo:table-header>
<fo:table-row>
<fo:table-cell padding-top = "2.0pt" padding-left = "2.0pt" border-style = "solid" border-width = "0.5pt" border-color = "#000000" background-color = "#D6DEE7" font-family = "sans-serif">
<fo:block>HEADER_COL1</fo:block>
</fo:table-cell>
<fo:table-cell padding-top = "2.0pt" padding-left = "2.0pt" border-style = "solid" border-width = "0.5pt" border-color = "#000000" background-color = "#D6DEE7" font-family = "sans-serif">
<fo:block>HEADER_COL2</fo:block>
</fo:table-cell>
<fo:table-cell padding-top = "2.0pt" padding-left = "2.0pt" border-style = "solid" border-width = "0.5pt" border-color = "#000000" background-color = "#D6DEE7" font-family = "sans-serif">
<fo:block>HEADER_COL3</fo:block>
</fo:table-cell>
<fo:table-cell padding-top = "2.0pt" padding-left = "2.0pt" border-style = "solid" border-width = "0.5pt" border-color = "#000000" background-color = "#D6DEE7" font-family = "sans-serif">
<fo:block>HEADER_COL4</fo:block>
</fo:table-cell>
<fo:table-cell padding-top = "2.0pt" padding-left = "2.0pt" border-style = "solid" border-width = "0.5pt" border-color = "#000000" background-color = "#D6DEE7" font-family = "sans-serif">
<fo:block>HEADER_COL5</fo:block>
</fo:table-cell>
<fo:table-cell padding-top = "2.0pt" padding-left = "2.0pt" border-style = "solid" border-width = "0.5pt" border-color = "#000000" background-color = "#D6DEE7" font-family = "sans-serif">
<fo:block>HEADER_COL6</fo:block>
</fo:table-cell>
<fo:table-cell padding-top = "2.0pt" padding-left = "2.0pt" border-style = "solid" border-width = "0.5pt" border-color = "#000000" background-color = "#D6DEE7" font-family = "sans-serif">
<fo:block>HEADER_COL7</fo:block>
</fo:table-cell>
<fo:table-cell padding-top = "2.0pt" padding-left = "2.0pt" border-style = "solid" border-width = "0.5pt" border-color = "#000000" background-color = "#D6DEE7" font-family = "sans-serif">
<fo:block>HEADER_COL8</fo:block>
</fo:table-cell>
<fo:table-cell padding-top = "2.0pt" padding-left = "2.0pt" border-style = "solid" border-width = "0.5pt" border-color = "#000000" background-color = "#D6DEE7" font-family = "sans-serif">
<fo:block>HEADER_COL9</fo:block>
</fo:table-cell>
</fo:table-row>
</fo:table-header>
<fo:table-body>
<fo:table-row>
<fo:table-cell padding-top = "2.0pt" padding-left = "2.0pt" border-style = "solid" border-width = "0.5pt" border-color = "#000000" font-family = "sans-serif" font-size = "7pt">
<fo:block>ROW1_COL1_VALUE</fo:block>
</fo:table-cell>
<fo:table-cell padding-top = "2.0pt" padding-left = "2.0pt" border-style = "solid" border-width = "0.5pt" border-color = "#000000" font-family = "sans-serif" font-size = "7pt">
<fo:block>ROW1_COL2_VALUE</fo:block>
</fo:table-cell>
<fo:table-cell padding-top = "2.0pt" padding-left = "2.0pt" border-style = "solid" border-width = "0.5pt" border-color = "#000000" font-family = "sans-serif" font-size = "7pt">
<fo:block>ROW1_COL3_VALUE</fo:block>
</fo:table-cell>
<fo:table-cell padding-top = "2.0pt" padding-left = "2.0pt" border-style = "solid" border-width = "0.5pt" border-color = "#000000" font-family = "sans-serif" font-size = "7pt">
<fo:block>ROW1_COL4_VALUE</fo:block>
</fo:table-cell>
<fo:table-cell padding-top = "2.0pt" padding-left = "2.0pt" border-style = "solid" border-width = "0.5pt" border-color = "#000000" font-family = "sans-serif" font-size = "7pt">
<fo:block>ROW1_COL5_VALUE</fo:block>
</fo:table-cell>
<fo:table-cell padding-top = "2.0pt" padding-left = "2.0pt" border-style = "solid" border-width = "0.5pt" border-color = "#000000" font-family = "sans-serif" font-size = "7pt">
<fo:block>ROW1_COL6_VALUE</fo:block>
</fo:table-cell>
<fo:table-cell padding-top = "2.0pt" padding-right = "2.0pt" border-style = "solid" border-width = "0.5pt" border-color = "#000000" font-family = "sans-serif" font-size = "7pt">
<fo:block text-align = "end">ROW1_COL7_VALUE</fo:block>
</fo:table-cell>
<fo:table-cell padding-top = "2.0pt" padding-left = "2.0pt" border-style = "solid" border-width = "0.5pt" border-color = "#000000" font-family = "sans-serif" font-size = "7pt">
<fo:block>ROW1_COL8_VALUE</fo:block>
</fo:table-cell>
<fo:table-cell padding-top = "2.0pt" padding-left = "2.0pt" border-style = "solid" border-width = "0.5pt" border-color = "#000000" font-family = "sans-serif" font-size = "7pt">
<fo:block>ROW1_COL9_VALUE</fo:block>
</fo:table-cell>
</fo:table-row>
<!-- A LOT OF ROWS HERE -->
<!-- I want to insert a break-before attribute as below -->
<fo:table-row break-before = "page">
<!-- columns here -->
</fo:table-row>
<!-- MORE ROWS HERE -->
<!-- LAST ROW NEXT -->
<fo:table-row>
<fo:table-cell padding-top = "2.0pt" padding-left = "2.0pt" border-style = "solid" border-width = "0.5pt" border-color = "#000000" font-family = "sans-serif" font-size = "7pt">
<fo:block>ROW20_COL1_VALUE</fo:block>
</fo:table-cell>
<fo:table-cell padding-top = "2.0pt" padding-left = "2.0pt" border-style = "solid" border-width = "0.5pt" border-color = "#000000" font-family = "sans-serif" font-size = "7pt">
<fo:block>ROW20_COL2_VALUE</fo:block>
</fo:table-cell>
<fo:table-cell padding-top = "2.0pt" padding-left = "2.0pt" border-style = "solid" border-width = "0.5pt" border-color = "#000000" font-family = "sans-serif" font-size = "7pt">
<fo:block>ROW20_COL3_VALUE</fo:block>
</fo:table-cell>
<fo:table-cell padding-top = "2.0pt" padding-left = "2.0pt" border-style = "solid" border-width = "0.5pt" border-color = "#000000" font-family = "sans-serif" font-size = "7pt">
<fo:block>ROW20_COL4_VALUE</fo:block>
</fo:table-cell>
<fo:table-cell padding-top = "2.0pt" padding-left = "2.0pt" border-style = "solid" border-width = "0.5pt" border-color = "#000000" font-family = "sans-serif" font-size = "7pt">
<fo:block>ROW20_COL5_VALUE</fo:block>
</fo:table-cell>
<fo:table-cell padding-top = "2.0pt" padding-left = "2.0pt" border-style = "solid" border-width = "0.5pt" border-color = "#000000" font-family = "sans-serif" font-size = "7pt">
<fo:block>ROW20_COL6_VALUE</fo:block>
</fo:table-cell>
<fo:table-cell padding-top = "2.0pt" padding-right = "2.0pt" border-style = "solid" border-width = "0.5pt" border-color = "#000000" font-family = "sans-serif" font-size = "7pt">
<fo:block text-align = "end">ROW20_COL7_VALUE</fo:block>
</fo:table-cell>
<fo:table-cell padding-top = "2.0pt" padding-left = "2.0pt" border-style = "solid" border-width = "0.5pt" border-color = "#000000" font-family = "sans-serif" font-size = "7pt">
<fo:block>ROW20_COL8_VALUE</fo:block>
</fo:table-cell>
<fo:table-cell padding-top = "2.0pt" padding-left = "2.0pt" border-style = "solid" border-width = "0.5pt" border-color = "#000000" font-family = "sans-serif" font-size = "7pt">
<fo:block>ROW20_COL9_VALUE</fo:block>
</fo:table-cell>
</fo:table-row>
</fo:table-body>
</fo:table>
<!-- endof table id FOPTable { id: 997 cur_size: 28.7 prv_size: 20.409999999999997 prev: 996 cols: 9 locks: 6 flow:null }
-->
</fo:table>
</fo:table>
</fo:flow>
</fo:page-sequence>
</fo:root>
Вложить таблицы на 3 уровня кажется слишком сложным. Это действительно необходимо?
Взяв ваши данные и удалив все ячейки и другое неважное содержимое, можно просто применить идентификационный XSL к XSL FO и изменить только целевую строку.
начиная с этого XML:
<fo:root xmlns:fo = "http://www.w3.org/1999/XSL/Format">
<fo:page-sequence force-page-count = "no-force" master-reference = "first" initial-page-number = "1">
<fo:flow flow-name = "xsl-region-body">
<fo:table font-size = "8pt" font-family = "sans-serif" space-before.optimum = "0.05cm" table-layout = "fixed">
</fo:table>
<fo:table font-size = "8pt" font-family = "sans-serif" space-before.optimum = "0.05cm" table-layout = "fixed">
</fo:table>
<fo:table font-size = "8pt" font-family = "sans-serif" space-before.optimum = "0.05cm" table-layout = "fixed">
<fo:table font-size = "8pt" font-family = "sans-serif" table-layout = "fixed">
<fo:table font-size = "8pt" font-family = "sans-serif" table-layout = "fixed">
<fo:table-column column-width = "2.87cm" />
<fo:table-column column-width = "2.87cm" />
<fo:table-column column-width = "2.87cm" />
<fo:table-column column-width = "4.709999999999996cm" />
<fo:table-column column-width = "2.87cm" />
<fo:table-column column-width = "3.9cm" />
<fo:table-column column-width = "2.87cm" />
<fo:table-column column-width = "2.87cm" />
<fo:table-column column-width = "2.87cm" />
<fo:table-header>
<fo:table-row>
<fo:table-cell padding-top = "2.0pt" padding-left = "2.0pt" border-style = "solid" border-width = "0.5pt" border-color = "#000000" background-color = "#D6DEE7" font-family = "sans-serif">
<fo:block>HEADER_COL1</fo:block>
</fo:table-cell>
<fo:table-cell padding-top = "2.0pt" padding-left = "2.0pt" border-style = "solid" border-width = "0.5pt" border-color = "#000000" background-color = "#D6DEE7" font-family = "sans-serif">
<fo:block>HEADER_COL2</fo:block>
</fo:table-cell>
<fo:table-cell padding-top = "2.0pt" padding-left = "2.0pt" border-style = "solid" border-width = "0.5pt" border-color = "#000000" background-color = "#D6DEE7" font-family = "sans-serif">
<fo:block>HEADER_COL3</fo:block>
</fo:table-cell>
<fo:table-cell padding-top = "2.0pt" padding-left = "2.0pt" border-style = "solid" border-width = "0.5pt" border-color = "#000000" background-color = "#D6DEE7" font-family = "sans-serif">
<fo:block>HEADER_COL4</fo:block>
</fo:table-cell>
<fo:table-cell padding-top = "2.0pt" padding-left = "2.0pt" border-style = "solid" border-width = "0.5pt" border-color = "#000000" background-color = "#D6DEE7" font-family = "sans-serif">
<fo:block>HEADER_COL5</fo:block>
</fo:table-cell>
<fo:table-cell padding-top = "2.0pt" padding-left = "2.0pt" border-style = "solid" border-width = "0.5pt" border-color = "#000000" background-color = "#D6DEE7" font-family = "sans-serif">
<fo:block>HEADER_COL6</fo:block>
</fo:table-cell>
<fo:table-cell padding-top = "2.0pt" padding-left = "2.0pt" border-style = "solid" border-width = "0.5pt" border-color = "#000000" background-color = "#D6DEE7" font-family = "sans-serif">
<fo:block>HEADER_COL7</fo:block>
</fo:table-cell>
<fo:table-cell padding-top = "2.0pt" padding-left = "2.0pt" border-style = "solid" border-width = "0.5pt" border-color = "#000000" background-color = "#D6DEE7" font-family = "sans-serif">
<fo:block>HEADER_COL8</fo:block>
</fo:table-cell>
<fo:table-cell padding-top = "2.0pt" padding-left = "2.0pt" border-style = "solid" border-width = "0.5pt" border-color = "#000000" background-color = "#D6DEE7" font-family = "sans-serif">
<fo:block>HEADER_COL9</fo:block>
</fo:table-cell>
</fo:table-row>
</fo:table-header>
<fo:table-body>
<fo:table-row/>
<fo:table-row/>
<fo:table-row/>
<fo:table-row/>
<fo:table-row/>
<fo:table-row/>
<fo:table-row/>
<fo:table-row/>
<fo:table-row/>
<fo:table-row/>
<fo:table-row/>
<fo:table-row/>
<fo:table-row/>
<fo:table-row/>
<fo:table-row/>
<fo:table-row/>
<fo:table-row/>
<fo:table-row/>
<fo:table-row/>
<fo:table-row/>
</fo:table-body>
</fo:table>
</fo:table>
</fo:table>
</fo:flow>
</fo:page-sequence>
</fo:root>
И применяя этот XSL, который выводит все как есть, за исключением шаблона, который вставляет разрыв страницы в 12-ю строку целевой таблицы:
<xsl:stylesheet xmlns:xsl = "http://www.w3.org/1999/XSL/Transform"
xmlns:fo = "http://www.w3.org/1999/XSL/Format"
version = "2.0">
<xsl:param name = "breakrow" select = "12"/>
<xsl:template match = "fo:table-row">
<xsl:variable name = "rowcnt" select = "count(preceding-sibling::fo:table-row)"/>
<xsl:choose>
<xsl:when test = "parent::fo:table-header">
<fo:table-row>
<xsl:apply-templates/>
</fo:table-row>
</xsl:when>
<xsl:when test = "$rowcnt = $breakrow and ancestor::fo:table[1]/fo:table-header/fo:table-row[1]/fo:table-cell[1]/fo:block/text() = 'HEADER_COL1'">
<fo:table-row break-before = "page"/>
</xsl:when>
<xsl:otherwise>
<fo:table-row/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template match = "@* | node()">
<xsl:copy>
<xsl:apply-templates select = "@*"/>
<xsl:apply-templates select = "node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
Результат такой:
<fo:root xmlns:fo = "http://www.w3.org/1999/XSL/Format">
<fo:page-sequence force-page-count = "no-force" master-reference = "first" initial-page-number = "1">
<fo:flow flow-name = "xsl-region-body">
<fo:table font-size = "8pt" font-family = "sans-serif" space-before.optimum = "0.05cm" table-layout = "fixed">
</fo:table>
<fo:table font-size = "8pt" font-family = "sans-serif" space-before.optimum = "0.05cm" table-layout = "fixed">
</fo:table>
<fo:table font-size = "8pt" font-family = "sans-serif" space-before.optimum = "0.05cm" table-layout = "fixed">
<fo:table font-size = "8pt" font-family = "sans-serif" table-layout = "fixed">
<fo:table font-size = "8pt" font-family = "sans-serif" table-layout = "fixed">
<fo:table-column column-width = "2.87cm"/>
<fo:table-column column-width = "2.87cm"/>
<fo:table-column column-width = "2.87cm"/>
<fo:table-column column-width = "4.709999999999996cm"/>
<fo:table-column column-width = "2.87cm"/>
<fo:table-column column-width = "3.9cm"/>
<fo:table-column column-width = "2.87cm"/>
<fo:table-column column-width = "2.87cm"/>
<fo:table-column column-width = "2.87cm"/>
<fo:table-header>
<fo:table-row>
<fo:table-cell padding-top = "2.0pt" padding-left = "2.0pt" border-style = "solid" border-width = "0.5pt" border-color = "#000000" background-color = "#D6DEE7" font-family = "sans-serif">
<fo:block>HEADER_COL1</fo:block>
</fo:table-cell>
<fo:table-cell padding-top = "2.0pt" padding-left = "2.0pt" border-style = "solid" border-width = "0.5pt" border-color = "#000000" background-color = "#D6DEE7" font-family = "sans-serif">
<fo:block>HEADER_COL2</fo:block>
</fo:table-cell>
<fo:table-cell padding-top = "2.0pt" padding-left = "2.0pt" border-style = "solid" border-width = "0.5pt" border-color = "#000000" background-color = "#D6DEE7" font-family = "sans-serif">
<fo:block>HEADER_COL3</fo:block>
</fo:table-cell>
<fo:table-cell padding-top = "2.0pt" padding-left = "2.0pt" border-style = "solid" border-width = "0.5pt" border-color = "#000000" background-color = "#D6DEE7" font-family = "sans-serif">
<fo:block>HEADER_COL4</fo:block>
</fo:table-cell>
<fo:table-cell padding-top = "2.0pt" padding-left = "2.0pt" border-style = "solid" border-width = "0.5pt" border-color = "#000000" background-color = "#D6DEE7" font-family = "sans-serif">
<fo:block>HEADER_COL5</fo:block>
</fo:table-cell>
<fo:table-cell padding-top = "2.0pt" padding-left = "2.0pt" border-style = "solid" border-width = "0.5pt" border-color = "#000000" background-color = "#D6DEE7" font-family = "sans-serif">
<fo:block>HEADER_COL6</fo:block>
</fo:table-cell>
<fo:table-cell padding-top = "2.0pt" padding-left = "2.0pt" border-style = "solid" border-width = "0.5pt" border-color = "#000000" background-color = "#D6DEE7" font-family = "sans-serif">
<fo:block>HEADER_COL7</fo:block>
</fo:table-cell>
<fo:table-cell padding-top = "2.0pt" padding-left = "2.0pt" border-style = "solid" border-width = "0.5pt" border-color = "#000000" background-color = "#D6DEE7" font-family = "sans-serif">
<fo:block>HEADER_COL8</fo:block>
</fo:table-cell>
<fo:table-cell padding-top = "2.0pt" padding-left = "2.0pt" border-style = "solid" border-width = "0.5pt" border-color = "#000000" background-color = "#D6DEE7" font-family = "sans-serif">
<fo:block>HEADER_COL9</fo:block>
</fo:table-cell>
</fo:table-row>
</fo:table-header>
<fo:table-body>
<fo:table-row/>
<fo:table-row/>
<fo:table-row/>
<fo:table-row/>
<fo:table-row/>
<fo:table-row/>
<fo:table-row/>
<fo:table-row/>
<fo:table-row/>
<fo:table-row/>
<fo:table-row/>
<fo:table-row/>
<fo:table-row break-before = "page"/>
<fo:table-row/>
<fo:table-row/>
<fo:table-row/>
<fo:table-row/>
<fo:table-row/>
<fo:table-row/>
<fo:table-row/>
</fo:table-body>
</fo:table>
</fo:table>
</fo:table>
</fo:flow>
</fo:page-sequence>
</fo:root>
Я передал 12 в качестве параметра и предположил, что у вас есть только одно место ... 12-я строка. Вы, конечно, можете использовать "мод" и делать каждый 12-й ряд или что хотите.
Например:
<xsl:when test = "$rowcnt mod $breakrow = $breakrow - 1 and ancestor::fo:table[1]/fo:table-header/fo:table-row[1]/fo:table-cell[1]/fo:block/text() = 'HEADER_COL1'">
И, конечно же, вы можете просто добавить к строкам, чтобы получить вывод всего содержимого ячеек.
Отличный подход, из любопытства могу я применить еще <xsl: when>? например: если $ rowcnt> 10 и $ rowcnt <20, тогда примените $ rowcnt = $ breakrow else, если $ rowcnt> = 20 и $ rowcnt <50, затем примените $ rowcnt = $ AnotherBreakrow иначе примените $ rowcnt mod $ breakrow = $ breakrow - 1
Конечно, но обычно можно делать то, что я написал последним, используя мод, который вставляет разрыв каждые «x» строк.
Если ответ помог, подумайте о том, чтобы правильно поставить вопрос.
Ответ помог, но не могли бы вы указать мне, как делать то, что объяснялось в моем предыдущем комментарии?
Я бы использовал XSLT. Поскольку вы используете VS2008, см. w3.org/TR/1999/REC-xslt-19991116. Вы можете создать шаблон для своего контекста, который добавляет атрибут для свойства, и создать шаблон удостоверения, который копирует остальную часть документа в результирующее дерево.