2016-03-17 3 views
-1

У меня возникли трудности с получением xsl: apply-template select, чтобы выбрать только нужные элементы. Каждая из следующих форм для элемента узла действительна.Сложность записи XPATH для выбора правильных узлов в XSLT

<?xml version="1.0" encoding="utf-8"?> 
<root> 
    <node>unimportant</node> 
    <node> 
    <value>unimportant</value> 
    <asdf>important</asdf> 
    </node> 
    <node> 
    <value>unimportant</value> 
    <value>unimportant</value> 
    <qwerty>important</qwerty> 
    </node> 
</root> 

Я хочу выбрать только узлы с «важным» контентом и избегать других. Имена узлов с важным контентом (asdf & qwerty) мне неизвестны и не могут быть частью логики преобразования.

Вот XSLT:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"> 
    <xsl:strip-space elements="*"/> 
    <xsl:output method="xml" indent="yes"/> 

    <xsl:template match="node"> 
    <xsl:apply-templates select="node()[not(self::value)]"/> 
    </xsl:template> 

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

А вот выход:

<?xml version="1.0" encoding="utf-8"?> 
<root>unimportant 
    <asdf>important</asdf> 
    <qwerty>important</qwerty> 
</root> 

Ожидаемые результаты будут следующими

<?xml version="1.0" encoding="utf-8"?> 
<root> 
    <asdf>important</asdf> 
    <qwerty>important</qwerty> 
</root> 

Преобразование правильно выбрать нужные элементы , но он также собирает несущественный контент из первого элемента узла. Как построить инструкцию select, которая позволяет избежать выбора этого контента?

+0

ли неважных имена узлов, известные Y ОУ? – Joshua

+1

Я не думаю, что вы достаточно хорошо объяснили проблему. Вы дали нам пример, и вы рассказали нам, как следует обрабатывать этот пример, но вы не дали нам общих правил. Мы не знаем, какая из строк в вашем примере (значение, asdf, qwerty, important, notimportant) являются буквальными строками, которые появляются в вашем реальном XML, и которые являются заполнителями для более общего содержимого. –

+0

@ Майкл Кэй. Да, в этой проблеме есть гораздо больше, чем в примере. Я упорно трудился, чтобы отогнать эту проблему до минимального necessary.Thankfully hr_117 был в состоянии помочь мне. –

ответ

1

Предполагая, что вы знаете, какие узлы ваши не как лечить (not(self::value)).
изменить ваш

<xsl:apply-templates select="node()[not(self::value)]"/> 

к

<xsl:apply-templates select="*[not(self::value)]"/> 

Это будет игнорировать неправильный текст() узлы

0

Будет ли это работать на вас?

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

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

<xsl:template match="/root"> 
    <xsl:copy> 
     <xsl:apply-templates select="node[.='important'] | node/*[.='important']"/> 
    </xsl:copy> 
</xsl:template> 

</xsl:stylesheet> 
+0

Нет, как и с именами (asdf, qwerty и т. Д.), Содержимое этих узлов произвольно, а не то, что может контролировать моя группа. –

+0

Итак, что определяет, какие узлы нужно копировать? Это любой элемент, кроме ''? –

-2
//node/*[not(self::value)] 

В качестве альтернативы,

//node/*[local-name() != "value"] 
+0

Предпочтительна форма «self :: value». –

Смежные вопросы