2014-11-13 5 views
2

У меня есть файл XML, как это:Использования/включает в себя значение из другого узла

<area1> 
    <settings> 
     <setting name="to_include">value</setting> 
    </settings> 
</area1> 
<area2> 
    <settings> 
     <setting name="where_to_include">?????</setting> 
    </settings> 
</area2> 

Я хочу, чтобы включить значение узла настройки «to_include» в качестве значения настройки узла "where_to_include". Как я мог сделать это, используя чистый XML-способ? XInclude? XPointer? XPath? XLink? Другие?

Я надеялся, что смогу сделать что-то вроде этого:

<area2> 
    <settings> 
     <setting name="where_to_include"> 
      <xi:include href="SAMEFILE" xpointer="xpointer(/areas/area1/settings/setting[@name='debug'])"> 
       <xi:fallback>FALLBACK VALUE</xi:fallback> 
     </setting> 
    </settings> 
</area2> 

Но с XInclude я не могу ссылаться на сам документ при разборе его.

+0

Очевидно, что вы не нашли времени, чтобы ознакомиться с этими технологиями XML. Что вам нужно, зависит от языка/среды, которую вы используете. Например, существуют решения для Python (например, lxml), Java, PHP; есть XQuery и XSLT. Как насчет просмотра учебника XSLT, прежде чем спрашивать здесь? –

+0

К сожалению, у меня нет времени, чтобы ознакомиться со всеми технологиями XML, но я стараюсь делать это шаг за шагом, когда появляются новые потребности. У меня уже есть решение на моем языке (PHP), но мне не разрешено выполнять изменения на нем. Причиной этого я задавался вопросом, существует ли там чистое XML-решение без изменения внешней среды. (я также добавил пример XPointer к моему вопросу) – Kamafeather

+0

Извинения, я немного неправильно понял ваш вопрос. Вы уверены, что XPointer и XLink поддерживаются вашим PHP-решением? –

ответ

0

Я не совсем понимаю вопрос, но я думаю, что у меня есть идея, что вы имеете в виду. Возможно, это не то, что вам нужно. Вы упоминаете XPointer и XInclude, которые кажутся мне излишними.

Вот решение XSLT (1.0). Таблица стилей принимает файл XML, такой как тот, который вы задаете в вопросе, и пробки value для ?????. (Ваш XML, кстати, отсутствует элемент-оболочка, поэтому он технически искажен. Но я думаю, что понимаю, что вы имеете в виду. Я тихо добавлю в качестве элемента документа, и вот как работает таблица стилей. может потребоваться настроить его, чтобы соответствовать XML, вы на самом деле работаете с)

Вот таблица стили:.

<?xml version='1.0' encoding='UTF-8'?> 

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" indent="yes"/> 

    <xsl:template match="*"> 
    <xsl:variable name="n" select="name (.)"/> 
    <xsl:element name="{$n}"> 
     <xsl:for-each select="@*"> 
     <xsl:copy-of select="."/> 
     </xsl:for-each> 
     <xsl:apply-templates select="node()"/> 
    </xsl:element> 
    </xsl:template> 

    <xsl:template match="text()"> 
    <xsl:copy-of select="."/> 
    </xsl:template> 

    <xsl:template match="/"> 
    <xsl:element name="areas"> 
     <xsl:apply-templates select="areas"/> 
    </xsl:element> 
    </xsl:template> 

    <xsl:template match="areas"> 
    <xsl:apply-templates select="area1"/> 
    <xsl:apply-templates select="area2"/> 
    </xsl:template> 

    <xsl:template match="text()[parent::setting[ancestor::area2]]"> 
    <xsl:apply-templates select="preceding::area1/settings/setting/text()"/> 
    </xsl:template> 
</xsl:stylesheet> 

Стилевых по существу только копирует свой входной XML документ, за исключением одного пункта: когда речь идет о с setting под area2, он не копирует текст, а возвращается к узлу area1 и копирует текст под его setting. Вы можете подтвердить, что это работает с использованием любого XSLT-процессора, например, xsltproc (похоже, что у вас есть некоторые нетривиальные функции XML в вашем распоряжении, поэтому это должно быть довольно просто). Просто внесите некоторые изменения в value и запустите таблицу стилей в измененном XML-документе.

+0

Пожалуйста, прекратите публикацию плохих ответов XSLT (все, что я сказал [здесь] (http://stackoverflow.com/a/29583141/1987598)). Как вы можете видеть в разделе комментариев, этот вопрос обсуждался в чате - и это подход, похожий на XInclude. OP заявила, что им не разрешено вносить какие-либо изменения в конвейер, обрабатывающий XML-документы. –