2015-06-03 4 views
1

Я довольно новичок в мире XSLT. может ли кто-нибудь помочь мне решить мой вопрос? У меня есть входной XML и желаемый выходной XML. Необходимо написать XSLT для этого преобразования. Состояние: , если любой элемент оканчивается на «11», то элемент дочерний узел «название» (если есть), то название будет заменено CDtitle т.е. CD11/название будет CD11/CDtitleдочерний элемент заменен на новое имя элемента

Input XML 
--------------- 
<catalog> 
<cd11> 
<title>Empire Burlesque</title> 
<artist>Bob Dylan</artist> 
<year>1985</year> 
</cd11> 
<cd22> 
<title>Empire Burlesque</title> 
<artist>Bob Dylan</artist> 
<year>1985</year> 
</cd22> 
<cd33> 
<title>Empire Burlesque</title> 
<artist>Bob Dylan</artist> 
<year>1985</year> 
</cd33> 
</catalog> 


Output XML 
--------------- 
<catalog> 
<cd11> 
<CDtitle>Empire Burlesque</CDtitle> 
<artist>Bob Dylan</artist> 
<year>1985</year> 
</cd11> 
<cd22> 
<title>Empire Burlesque</title> 
<artist>Bob Dylan</artist> 
<year>1985</year> 
</cd22> 
<cd33> 
<title>Empire Burlesque</title>`enter code here` 
<artist>Bob Dylan</artist> 
<year>1985</year> 
</cd33> 
</catalog> 

ответ

1

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

Так начните с этого, который копирует все:

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

Затем добавить, что вы хотите, что является уникальным в более конкретном матче. В вашем случае вы можете указать это как «любое название, чей родительский конец заканчивается на« 11 ». Вы могли бы написать, что это так:

<xsl:template match="title[substring(name(parent::*),string-length(name(parent::*)) - 1, 2) = '11']"> 

Собираем вместе:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
     version="1.0"> 
     <xsl:template match="title[substring(name(parent::*),string-length(name(parent::*)) - 1, 2) = '11']"> 
      <CDTitle> 
       <xsl:apply-templates /> 
      </CDTitle> 
     </xsl:template> 
     <xsl:template match="@* | node()"> 
      <xsl:copy> 
       <xsl:apply-templates select="@* | node()"/> 
      </xsl:copy> 
     </xsl:template> 
    </xsl:stylesheet> 

Выход:

<catalog> 
<cd11> 
    <CDTitle>Empire Burlesque</CDTitle> 
    <artist>Bob Dylan</artist> 
    <year>1985</year> 
</cd11> 
<cd22> 
    <title>Empire Burlesque</title> 
    <artist>Bob Dylan</artist> 
    <year>1985</year> 
</cd22> 
<cd33> 
    <title>Empire Burlesque</title> 
    <artist>Bob Dylan</artist> 
    <year>1985</year> 
</cd33> 
</catalog 
+0

Thank you @Kevin. Это мне очень помогло. –

0

Ниже простой XSL будет сделать ур Ouput, как и ожидалось.

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:template match="@* | node()"> 
    <xsl:copy> 
<xsl:apply-templates select="@* | node()"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="cd11"> 
<xsl:copy> 
    <CDTitle> 
    <xsl:value-of select ="title"/> 
    </CDTitle> 
     <xsl:copy-of select = "artist"/> 
    <xsl:copy-of select = "year"/> 
    </xsl:copy>  


</xsl:template> 
</xsl:stylesheet> 
Смежные вопросы