XSLT - «Применить» обновления к другому файлу - PullRequest
0 голосов
/ 02 октября 2018

У меня есть какая-то конфигурация Tomcat, которую я пытаюсь автоматизировать, изменяя.Что-то может выглядеть так:

<web-app>
  <!-- many other configuration options here... -->
  <session-config>
    <session-timeout>30</session-timeout>
  </session-config>
  <!-- many other configuration options here... -->
<web-app>

И я хочу обновить только одно значение, оставив остальные нетронутыми.Итак, я определил файл с такой же структурой, только значение, которое я хочу изменить в нем:

<web-app>
  <session-config>
    <session-timeout>15</session-timeout>
  </session-config>
<web-app>

Вот мой XSLT, предоставляющий ему файл обновления в качестве входных данных и файл конфигурации TC "по умолчанию"путь в качестве параметра:

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

  <xsl:output method="xml" version="1.0" encoding="UTF-8" />
  <xsl:param name="tcInputFilePath" />
  <xsl:param name="tcInputFile" select="document($tcInputFilePath)" />

  <xsl:template match="/">
    <xsl:apply-templates select="$tcInputFile/*" />
  </xsl:template>

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

</xsl:stylesheet>

По сути, я хочу получить копию $tcInputFile с изменениями, внесенными из файла обновления.Я предполагаю, что мне нужен какой-то способ найти тот же путь в файле обновления, что и при обходе файла TC, затем проверить, нет ли у этого пути дочерних узлов, и применить value-of вместо copy если так.Я просто не знаю, как выбрать «тот же узел» в другом документе при обходе.Помощь

1 Ответ

0 голосов
/ 02 октября 2018

См. http://xslt -3-by-example.blogspot.com / 2017/06 / using-xslevaluate-and-path-function-to.html для общего решения XSLT 3 для аналогичногоПроблема, хотя там есть входные элементы, которые необходимо обновить, для вашего случая вам нужно будет объяснить и реализовать способ проверки соответствующего элемента.И для этого решения требуется xsl:evaluate, который доступен только в коммерческих версиях Saxon 9.8 и 9.9.

Поскольку Saxon 9.8 и 9.9 во всех выпусках поддерживают функцию transform https://www.w3.org/TR/xpath-functions/#func-transform, эта проблема может бытьрешена в этих процессорах XSLT 3 также путем генерации таблицы стилей на лету и ее запуска:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:axsl="http://www.w3.org/1999/XSL/Transform-alias"
    exclude-result-prefixes="#all"
    expand-text="yes"
    version="3.0">

  <xsl:param name="config-doc">
    <web-app>
      <foo-config>
          <foo-value>foo</foo-value>
      </foo-config>
      <!-- many other configuration options here... -->
      <session-config>
        <session-timeout>30</session-timeout>
      </session-config>
      <!-- many other configuration options here... -->
      <bar-config>
          <bar-value>bar</bar-value>
      </bar-config>
    </web-app>      
  </xsl:param>

  <xsl:output indent="yes"/>

  <xsl:mode on-no-match="shallow-copy"/>

  <xsl:namespace-alias stylesheet-prefix="axsl" result-prefix="xsl"/>

  <xsl:variable name="stylesheet">
      <axsl:stylesheet version="3.0" exclude-result-prefixes="#all">
          <axsl:mode on-no-match="shallow-copy"/>
          <xsl:for-each select="//text()[normalize-space()]">
              <axsl:template match="{path()}">{.}</axsl:template>
          </xsl:for-each>
      </axsl:stylesheet>
  </xsl:variable>

  <xsl:template match="/">
     <xsl:sequence select="transform(map { 'source-node' : $config-doc, 'stylesheet-node' : $stylesheet })?output"/>
  </xsl:template>

</xsl:stylesheet>

Там основной документ конфигурации встроен, но вы, конечно, можете использовать document или doc вместо загрузкиэто.

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

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