Манипулировать XSLT-файлом в C # - PullRequest
0 голосов
/ 19 декабря 2018

У меня есть программа, использующая файл XSLT для генерации файлов PDF, узлы сом в файле XSLT имеют атрибут font-family.Мы хотим сделать шрифт настраиваемым в файле конфигурации, что означает, что мы хотим изменить значение всех атрибутов перед применением стиля xslt:

public void GeneratePDF(string xsltPath, DataSet data)
{
  XslCompiledTransform xslTrans = new XslCompiledTransform();

  // here I want modify all elements having the font-family attribute
   xslTrans.Load(path)
   //....
}

Файл XSLT выглядит следующим образом:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format">

  <xsl:import href="../masterLayout.xslt" />
  <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
  <xsl:param name="ServerAppPath" select="'c:\inetpub\wwwroot\webApi'"/>
  <xsl:param name="Orientation" select="'Portrait'"/>
  <xsl:param name="PaperSize" select="'A4'"/>   
  <xsl:template match="StatusA">
        <fo:root>
            <xsl:call-template name="FOFileHeader"/>

            <!-- DOCUMENT -->
            <fo:page-sequence master-reference="pages" font-family="Verdana" initial-page-number="1" font-size="8pt">
                <xsl:call-template name="Region1"/>
                <xsl:call-template name="Region2"/>
                <xsl:call-template name="FirstRegionAfter"/>
                <fo:flow flow-name="xsl-region-body" font-size="8pt">

Ответы [ 2 ]

0 голосов
/ 20 декабря 2018

Почему бы просто не добавить еще один параметр в таблицу стилей?

 <xsl:param name="FontFamilty" select="'Verdana'"/>

...

 <fo:page-sequence master-reference="pages" font-family="{$FontFamily}"...
0 голосов
/ 19 декабря 2018

XSLT - это XML, и поэтому вы можете использовать XSLT для преобразования одной таблицы стилей XSLT в другую, простой пример:

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

  <xsl:param name="font-family">Times New Roman</xsl:param>
  <xsl:param name="font-size">16pt</xsl:param>

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

  <xsl:template match="fo:*/@font-family">
      <xsl:attribute name="font-family">
          <xsl:value-of select="$font-family"/>
      </xsl:attribute>
  </xsl:template>

  <xsl:template match="fo:*/@font-size">
      <xsl:attribute name="font-size">
          <xsl:value-of select="$font-size"/>
      </xsl:attribute>
  </xsl:template>

</xsl:stylesheet>

, который в качестве входных данных ожидает любой документ XML или XSLT, содержащий некоторые элементы XSL-FO сfont-family или font-size атрибуты и преобразуют их, чтобы получить значение из глобальных параметров.

Онлайн-пример: https://xsltfiddle.liberty -development.net / 94hvTAo

В .NET API вы можете использовать XsltArgumentList (https://docs.microsoft.com/en-us/dotnet/api/system.xml.xsl.xsltargumentlist?view=netframework-4.7.2) для установки таких глобальных параметров при запуске XSLT с методом Transform (https://docs.microsoft.com/en-us/dotnet/api/system.xml.xsl.xslcompiledtransform.transform?view=netframework-4.7.2).

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