2014-11-24 3 views
0

У меня есть requierement, как показано ниже:получить узел и значение, если это не нуль, используя XSLT

если я дать ввод как:

<?xml version="1.0"?> 
<new:NewAddressData xmlns:new="http://www.example.org/NewAddress"> 
    <new:NewStreet></new:NewStreet> 
    <new:NewArea>Area_1</new:NewArea> 
    <new:NewState></new:NewState> 
</new:NewAddressData> 

Вывод должен быть:

<new:NewArea>Area_1</new:NewArea> 

На самом деле Иам новая пчела для XSLT, но я прочитал некоторые основы и попытался под кодом:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" omit-xml-declaration="yes"/> 
<xsl:strip-space elements="*"/> 
<!-- identity transform --> 
<xsl:template match="@*|node()">   
    <xsl:copy> 
     <xsl:choose> 
      <xsl:when test="@*|node() != ''"> 
     <xsl:value-of select="." disable-output-escaping="yes" /> 
      </xsl:when>       
      <xsl:otherwise> 
       <xsl:apply-templates select="@*|node()"/> 
      </xsl:otherwise> 
     </xsl:choose> 
    </xsl:copy> 
</xsl:template> 

для этого я получаю выход как:

<new:NewAddressData xmlns:new="http://www.example.org/NewAddress">Area_1</new:NewAddressData> 

где ожидаемое значение должно быть как:

<new:NewArea>Area_1</new:NewArea> 

Так как я могу добиться этого при помощи XSLT 1.0

Спасибо аванс

+4

Что вы здесь сделали: вы отбросили требование на этот сайт, в надежде, что кто-то даст вам коды. Это не работает на этом веб-сайте. Пожалуйста, покажите свои усилия и объясните конкретные проблемы, которые у вас есть. Мы не являемся бесплатным сервисом программирования. – Tomalak

+0

Ввод не является стандартным XML, он плохо сформирован, разместите XSLT, что вы пытались получить результат. –

+0

Hi @Tomalak благодарит за ответ. сообщите мне, если требуется какая-либо другая информация. –

ответ

0

Похоже, вы прочитали о шаблоне идентичности XSLT, что хорошо!

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

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

<xsl:template match="*[not(text()[normalize-space()])]"> 

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

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

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

    <xsl:template match="*[not(text()[normalize-space()])]"> 
     <xsl:apply-templates /> 
    </xsl:template> 
</xsl:stylesheet> 

Этот вывод бы следующий

<new:NewArea xmlns:new="http://www.example.org/NewAddress">Area_1</new:NewArea> 

Пространство имен необходимо здесь. Вы не можете выводить элемент с префиксом, не объявляя также связанное с ним пространство имен.

+0

Hi @Tim, спасибо за руку помощи. код работает как ожидалось. –

1

Вы можете сделать что-то вроде этого:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output indent="yes"/> 
    <xsl:strip-space elements="*"/> 

    <xsl:template match="*[text()]"> 
     <xsl:copy-of select="."/> 
    </xsl:template> 

</xsl:stylesheet> 

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

+0

Идеальный код, он также работает для сложных элементов. –

+0

Привет @ Даниэль, спасибо за руку помощи. код работает как ожидалось. –