2012-07-24 2 views
0

Мне нужно выбрать Property1 и SubProperty2 и удалить любые другие свойства. Мне нужно сделать это будущее доказательством, чтобы любые новые свойства, добавленные в xml, не нарушали проверки. По умолчанию новые поля Iow должны быть удалены.Не удалось выбрать свойства с помощью XSLT

<Root> 
    <Property1/> 
    <Property2/> 
    <Thing> 
     <SubProperty1/> 
     <SubProperty2/> 
    </Thing> 
    <VariousProperties/> 
</Root> 

так в моей XSLT Я сделал это:

<xsl:template match="Property1"> 
    <Property1> 
     <xsl:apply-templates/> 
    </Property1> 
    </xsl:template> 

<xsl:template match="/Thing"> 
    <SubProperty1> 
     <xsl:apply-templates select="SubProperty1" /> 
    </SubProperty1> 
</xsl:template> 

<xsl:template match="*" /> 

Последняя строка должна раздеться ничего я не определен, чтобы быть выбраны.

Это работает, чтобы выбрать мое свойство1, но всегда выбирает пустой узел для SubProperty. Матч на *, кажется, удаляет более глубокий объект, прежде чем мой матч на них может работать. Я удалил совпадение * и он выбрал мой SubProperty со значением. Итак, как я могу выбрать вспомогательные свойства и все еще удалить все, что я не использую.

Спасибо за консультацию.

+0

Nevermind ... Я понял, как делать то, что мне нужно ... – user1549583

ответ

0

Есть две проблемы:

<xsl:template match="*"/> 

Это игнорирует любой элемент, для которого существует не преобладающий, более конкретно шаблон.

Поскольку не существует определенного шаблона для верхнего элемента Root, он игнорируется вместе со всем его поддеревом, которое является полным документом, и никакой вывод вообще не производится.

Вторая проблема здесь:

<xsl:template match="/Thing"> 

Этот шаблон соответствует верхнему элементу с именем Thing.

Однако в представленном документе верхний элемент имеет имя Root. Поэтому приведенный выше шаблон не соответствует ни одному узлу из предоставленного XML-документа и никогда не выбран для его выполнения. Поскольку код внутри его тела должен генерировать SubProperty1, такой вывод не генерируется.

Решение:

Изменить

<xsl:template match="*"/> 

в:

<xsl:template match="text()"/> 

И изменить

<xsl:template match="/Thing"> 

в

<xsl:template match="Thing"> 

Вся трансформация становится:

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

     <xsl:template match="Property1"> 
     <Property1> 
      <xsl:apply-templates/> 
     </Property1> 
     </xsl:template> 

    <xsl:template match="Thing"> 
     <SubProperty1> 
      <xsl:apply-templates select="SubProperty1" /> 
     </SubProperty1> 
    </xsl:template> 

    <xsl:template match="text()" /> 
</xsl:stylesheet> 

И при нанесении на следующий документ XML (как при условии сильно уродливы это было фиксированный):

<Root> 
    <Property1/> 
    <Property2/> 
    <Thing> 
     <SubProperty1/> 
     <SubProperty2/> 
    </Thing> 
    <VariousProperties/> 
</Root> 

результат в настоящее время является то, что хотел:

<Property1/> 
<SubProperty1/> 
Смежные вопросы