2015-01-20 3 views
0

Я хотел удалить все записи ниже xml, в котором есть «tig:». Я попробовал преобразование xsl, преобразованное ниже, и оно не работает.xslt преобразование для удаления элементов

<ContactInfo> 
    <PersonName> 
     <FormattedName>My Name</FormattedName> 
     <GivenName>Test first Name</GivenName> 
     <FamilyName>Test Last Name</FamilyName> 
    </PersonName> 
     </ContactInfo> 
    <tig:TestArea> 
     <tig:UserArea> 
      <tig:ParseTime>9000</tig:ParseTime> 
     </tig:UserArea> 
     <tig:Country> 
      <tig:Language>en</tig:Language> 
     <tig:Country>CAN</tig:Country> 
     </tig:Country> 
    </tig : TestArea> 

Я попробовал преобразование xsl, преобразованное ниже, и это не сработало. tig: также является пространством имен, и я хочу удалить все элементы, связанные с этим пространством имен.

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

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

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

    </xsl:stylesheet> 

ответ

1

Вместо

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

использования

<xsl:template match="tig:"/> 
+0

Это не может работать, потому что (a) '' tig: "' не является допустимым шаблоном соответствия и (2) префикс 'tig' не привязан к пространству имен. –

0

Первое, что нужно сказать, что ваш XML отсутствует объявление пространства имен для префикса "Tig". Также отсутствует один корневой элемент, поэтому я предполагаю, что есть корневой элемент в Вашем XML, где пространство имен объявляется

<Data xmlns:tig="http://tig"> 
    <ContactInfo> 

Вы также должны объявить пространство имен в вашем XSLT

<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:tig="http://tig"> 

Но в ответ на ваш вопрос, почему он не работает (более вероятно, вы получаете сообщение об ошибке), является то, что синтаксис должен быть этот

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

Обратите внимание, что это снимает (вернее, не выводит) элемент, но он продолжает обрабатывать его дочерние элементы, что в конечном итоге приведет к выводу текстовых узлов (таких как «en» и «CAN»). Для того, чтобы остановить это, возможно, потребуется добавить следующий шаблон слишком

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

Попробуйте этот XSLT

<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:tig="http://tig"> 

    <xsl:output method="xml" indent="yes"/> 

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

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

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

Примечание, вы могли бы заменить два tig шаблоны со следующим шаблоном соответствия

<xsl:template match="tig:*" /> 

Однако, если у вас были элементы, вложенные под элемент tig, который принадлежал другому пространству имен (или вообще не содержался в пространстве имен), это означало бы b e удалено тоже.

1

Учитывая хорошо сформированные входные, такие как:

<root> 
    <ContactInfo> 
     <PersonName> 
      <FormattedName>My Name</FormattedName> 
      <GivenName>Test first Name</GivenName> 
      <FamilyName>Test Last Name</FamilyName> 
     </PersonName> 
    </ContactInfo> 
    <tig:TestArea xmlns:tig="http://www.example.com/tig"> 
      <tig:UserArea> 
       <tig:ParseTime>9000</tig:ParseTime> 
      </tig:UserArea> 
      <tig:Language>en</tig:Language> 
      <tig:Country>CAN</tig:Country> 
    </tig:TestArea> 
</root> 

следующая таблица стилей:

XSLT-1,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"/> 
<xsl:strip-space elements="*"/> 

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

<xsl:template match="tig:*" xmlns:tig="http://www.example.com/tig"/> 

</xsl:stylesheet> 

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

<?xml version="1.0" encoding="UTF-8"?> 
<root> 
    <ContactInfo> 
     <PersonName> 
     <FormattedName>My Name</FormattedName> 
     <GivenName>Test first Name</GivenName> 
     <FamilyName>Test Last Name</FamilyName> 
     </PersonName> 
    </ContactInfo> 
</root> 
Смежные вопросы