Я просто хочу заменить некоторые значения / атрибуты элемента 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
(взято из здесь ).
Мои вопросы
- Какое из пространств имен требуется и как (какое ключ) я должен установить их в моей таблице стилей ?
- Зачем они мне нужны, даже если удаленная / не активирована проверка?
- У меня даже есть изменения сделать это удаленно? Похоже, что эти файлы схем больше не существуют на серверах 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.