Есть ли способ предотвратить отображение несоответствующих тегов XML с помощью xslt? - PullRequest
2 голосов
/ 11 мая 2010

Вот надуманный пример XML-документа. В моем случае с реальным миром xml довольно сложный с несколькими вложенными уровнями.

<alphabet>
<a>A</a>
<b>B</b>
<c>C</c> 
... and so on
</alphabet>

Используя xslt, я хочу преобразовать документ так, чтобы печатались только гласные.

В моем случае мы используем пустые теги совпадений шаблонов, чтобы заблокировать отображение. Но это слишком многословно, на мой взгляд.

Ответы [ 2 ]

1 голос
/ 11 мая 2010

Я бы не позволил шаблону сопоставления «по умолчанию» или «наименьший приоритет / приоритет» молча глотать гласные или делать любые другие значимые обработки приложений .

Хорошей практикой является то, что шаблон для всех остальных несопоставленных узлов (данного типа) должен создавать хорошее сообщение об отладке и, при необходимости, прекращать обработку.

Если эта рекомендуемая практика не будет соблюдена, то некоторые ошибки будут незаметно оставлены незамеченными, и будет очень трудно найти их и исправить в любой заданный фиксированный период времени.

Вот решение, которое включает только один пустой шаблон :

<xsl:stylesheet version="2.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:my="my:my"
 >
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <my:vowels>
   <c>A</c>
   <c>E</c>
   <c>I</c>
   <c>O</c>
   <c>U</c>
 </my:vowels>

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

 <xsl:template match="c[not(. = document('')/*/my:vowels/*)]"/>
</xsl:stylesheet>

Когда это преобразование выполняется для следующего XML-документа :

<alphabet>
    <c>A</c>
    <c>B</c>
    <c>C</c>
    <c>D</c>
    <c>E</c>
    <c>F</c>
    <c>G</c>
    <c>H</c>
    <c>I</c>
    <c>J</c>
    <c>K</c>
    <c>L</c>
    <c>M</c>
    <c>N</c>
    <c>O</c>
    <c>P</c>
    <c>Q</c>
    <c>R</c>
    <c>S</c>
    <c>T</c>
    <c>U</c>
    <c>V</c>
    <c>W</c>
    <c>X</c>
    <c>Y</c>
    <c>Z</c>
</alphabet>

желаемый результат получен :

<alphabet>
    <c>A</c>
    <c>E</c>
    <c>I</c>
    <c>O</c>
    <c>U</c>
</alphabet>
0 голосов
/ 11 мая 2010

XSLT имеет правил приоритета для шаблонов с конфликтующими совпадениями (ссылка на спецификацию XSLT). Следовательно, вы можете иметь шаблон *, который по умолчанию «проглатывает» теги, и добавлять явные шаблоны, которые отображают или обрабатывают гласные.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...