2013-08-16 4 views
1

Это, возможно, уже ответил где-то, но я не правильные слова для поиска его:XSLT-фильтр узлов на основе данного списка узлов

Допустим, у меня есть файл данных, который имеет список городов:

<cities> 
    <city abbr='A'>NameA</city> 
    <city abbr='b'>NameB</city> 
    </cities> 

список городов давно, и я хочу, чтобы фильтровать города на основе сокр

[фильтрация данных]

<skip> 
    <abbr>A</abbr> 
    <abbr>B</abbr> 
    </skip> 

Как я мог бы использовать данные этого фильтра (в виде XML), чтобы пропустить некоторые узлы из исходного файла данных, в частности, как я могу использовать в наличии для каждого контура, например

<xsl:template match="/">  
     <xsl:for-each select="not in skip list"> 
     ??? 
     </xsl:for-each>  
    </xsl:template> 

Я хочу использовать данные фильтра внутри в пределах XSLT-файл в виде XML-формата, поскольку список может занять слишком много времени. Каковы варианты включения файла в xslt? В настоящее время я использую SAXON sth, как это.

java -jar /usr/local/liquibase/saxon/saxon9he.jar ./base/cities.xml ./templates/split_cities.xslt authorName=sakhunzai 

Этого пример над упрощением исходных данных

ответ

4

Вы меченые своим вопрос с саксонским тегом, так что я предполагаю, что вы используете XSLT 2.0.

Вы могли бы сделать значение переменного холдинговым быть пропущено

<xsl:variable name="skip"> 
    <abbr>A</abbr> 
    <abbr>C</abbr> 
</xsl:variable> 

Затем вы можете проверить атрибут узлов против этого переменного

<xsl:apply-templates select="cities/city[not(@abbr = $skip/abbr)]" /> 

Таким образом, для ввода

<?xml version="1.0" encoding="UTF-8"?> 
<cities> 
    <city abbr='A'>NameA1</city> 
    <city abbr='B'>NameB1</city> 
    <city abbr='C'>NameC1</city> 
    <city abbr='A'>NameA2</city> 
    <city abbr='B'>NameB2</city> 
    <city abbr='C'>NameC2</city> 
    </cities> 

После XSLT

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:fn="http://www.w3.org/2005/xpath-functions"> 
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 

    <xsl:variable name="skip"> 
     <abbr>A</abbr> 
     <abbr>C</abbr> 
    </xsl:variable> 

    <xsl:template match="/"> 
     <cities> 
      <xsl:apply-templates select="cities/city[not(@abbr = $skip/abbr)]" /> 
     </cities> 
    </xsl:template> 

    <xsl:template match="city"> 
     <xsl:copy-of select="." /> 
    </xsl:template> 
</xsl:stylesheet> 

производит вывод

<?xml version="1.0" encoding="UTF-8"?> 
<cities xmlns:fn="http://www.w3.org/2005/xpath-functions" xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <city abbr="B">NameB1</city> 
    <city abbr="B">NameB2</city> 
</cities> 

EDIT:

Это имеет смысл для хранения фильтра во внешнем файле. Пусть skip.xml быть такой файл со структурой

<?xml version="1.0" encoding="UTF-8"?> 
<skip> 
    <abbr>A</abbr> 
    <abbr>C</abbr> 
</skip> 

Затем вы можете изменить объявление переменной в следующем порядке

<xsl:variable name="skip" select="document('path/to/skip.xml')/skip/abbr" /> 

Другое дело может остаться без изменений.

+0

Отлично, позвольте мне попробовать – sakhunzai

+0

, как насчет включения внешних файлов, спасибо, например, за его работу в настоящее время. Но позвольте сказать, что я хочу сохранить внешний файл фильтра и передать имя файла фильтра в качестве параметра :), спасибо – sakhunzai

+1

Да, это имеет смысл - я улучшил свой ответ. –

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