Автоматизация LotusConnections-config. xml модификаций с помощью XSL / xsltpro c: Ничто не заменено неправильным пространством имен - PullRequest
0 голосов
/ 05 марта 2020

Я просто хочу заменить некоторые значения / атрибуты элемента XLML в LotusConnections-config.xml. Простой пример:

<?xml version="1.0" encoding="UTF-8"?><!-- Copyright IBM Corp. 2001, 2017  All Rights Reserved.              -->
<config buildlevel="IC6.0_20170314_1305" id="LotusConnections" xmlns="http://www.ibm.com/LotusConnections-config" xmlns:sloc="http://www.ibm.com/service-location" xmlns:tns="http://www.ibm.com/LotusConnections-config" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.ibm.com/LotusConnections-config LotusConnections-config.xsd">

<hostWhitelist enabled="false">
        <domain>admin_replace.com</domain>
</hostWhitelist>
<!-- ... -->
</config>

Чтобы изменить hostWhitelist Я попробовал следующую таблицу стилей

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <!-- Copies every input node unchanged -->
  <xsl:template match="node() | @*">
    <xsl:copy>
      <xsl:apply-templates select="node() | @*" />
    </xsl:copy>
  </xsl:template>

  <xsl:template match="hostWhitelist">
       ==XXXXX==
  </xsl:template>
</xsl:stylesheet>

Этот простой пример показывает фундаментальную проблему: я ожидал заменить

<hostWhitelist enabled="false">
        <domain>admin_replace.com</domain>
</hostWhitelist>

на ==XXXXX==. Но после запуска xsltproc --novalid --nonet -o poc-out.xml poc-rules.xml poc-in.xml я получил тот же, неизмененный ввод в poc-out.xml без каких-либо предупреждений или сообщений об ошибках. После долгих исследований я нашел этот вопрос . Чтобы проверить, соответствует ли это моей проблеме, я попытался обходной путь замены <xsl:template match="hostWhitelist"> на <xsl:template match="*[name()='hostWhitelist']">, и моя замена сработала.

Но я не совсем понимаю, какое из множества пространств имен из LotusConnections-config.xml мне нужно добавить, какой префикс / суффикс установить и почему это даже имеет значение, когда передается --novalid --nonet. Кажется, http://www.ibm.com/LotusConnections-config - это пространство имен. Я пробовал разные комбинации, например

, в результате чего

# xsltproc --novalid --nonet -o poc-out.xml poc-rules.xml poc-in.xml 
compilation error: file poc-rules.xml line 1 element stylesheet
xsltParseStylesheetProcess : document is not a stylesheet

Я также пробовал

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xml="http://www.ibm.com/LotusConnections-config" version="1.0">

, так как я обрабатываю XML , но это также вызывает ошибки. Исходный пример из поста SO

не дал мне никакой ошибки, но ничего не заменяет. То же самое для xpath-default-namespace="http://www.ibm.com/LotusConnections-config" в <xls:stylesheet (взято из здесь ).

Мои вопросы

  1. Какое из пространств имен требуется и как (какое ключ) я должен установить их в моей таблице стилей ?
  2. Зачем они мне нужны, даже если удаленная / не активирована проверка?
  3. У меня даже есть изменения сделать это удаленно? Похоже, что эти файлы схем больше не существуют на серверах IBM.

Что частично сработало

xmlstarlet имеет заполнитель _ для пространства имен по умолчанию . Я предполагаю, что это извлечено из входного файла xml, так как он предлагает замену с использованием CLI без таблицы стилей файла, как xsltproc делает.

# xmlstarlet select -t -c "/_:config/_:hostWhitelist" /tmp/lc-checkout/LotusConnections-config.xml 
<hostWhitelist xmlns="http://www.ibm.com/LotusConnections-config" xmlns:sloc="http://www.ibm.com/service-location" xmlns:tns="http://www.ibm.com/LotusConnections-config" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" enabled="false">
       <domain>admin_replace.com</domain>

При использовании * Опция 1072 *, может использоваться как для подстановок, так и для получения значений xpath.

1 Ответ

0 голосов
/ 05 марта 2020

Ваш XML объявляет пространство имен по умолчанию в элементе root config как:

 xmlns="http://www.ibm.com/LotusConnections-config" 

Это пространство имен наследуется всеми потомками config, если только переопределяется другим объявлением пространства имен.

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

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:cfg="http://www.ibm.com/LotusConnections-config">
  <!-- Copies every input node unchanged -->
  <xsl:template match="node() | @*">
    <xsl:copy>
      <xsl:apply-templates select="node() | @*" />
    </xsl:copy>
  </xsl:template>

  <xsl:template match="cfg:hostWhitelist">
       ==XXXXX==
  </xsl:template>
</xsl:stylesheet>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...