2015-12-06 2 views
0

Я создал скрипт xslt, который возьмет любой скрипт xml и преобразует текстовые узлы в элементы в атрибуты этих элементов. Элементы будут иметь только дочерние элементы или текстовые узлы, но не имели бы атрибуты или что-нибудь еще, например,xslt Преобразование текстовых узлов в атрибуты

<example> 
    <A>12</A> 
    <B></B> 
    <example> 

должен в конечном итоге выглядит как:

<example> 
    <A Val='12'></A> 
    <B></B> 
    <example> 

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

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL /Transform"> 
<xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/> 
<xsl:strip-space elements="*"/> 
<xsl:template match="/"> 
     <xsl:for-each select="*"> 
       <xsl:when test="./text()"/> 
          <xsl:element name="{local-name()}" > 
         <xsl:attribute name="Val"> 
           <xsl:value-of select="normalize- space(text())"/> 
         </xsl:attribute> 
        </xsl:element> 
        </xsl:when> 
        <xsl:otherwise> 
          <xsl:copy-of select="."/> 
        </xsl:otherwise>   
      </xsl:for-each> 
    </xsl:template> 

xmls будет более сложным, чем мой пример.

+0

Имеет ли ваш фактический xml смешанный контент (элемент с текстом и дочерними элементами элемента)? Если да, то как следует обращаться с ними? –

+0

да это, текст должен стать атрибутом родительского – bdanger

ответ

1

Вместо того чтобы делать в xsl:for-each (нагрузочный подход), я хотел бы использовать кнопочный подход ...

XML Input

<example> 
    <A>12</A> 
    <A>some a text <B>some b text</B> more a text</A> 
    <B></B> 
</example> 

XSLT 1,0

<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="@*|node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
    </xsl:template> 

    <xsl:template match="*[text()]"> 
    <xsl:variable name="text"> 
     <xsl:apply-templates select="text()"/> 
    </xsl:variable> 
    <xsl:copy> 
     <xsl:attribute name="Val"> 
     <xsl:value-of select="normalize-space($text)"/> 
     </xsl:attribute> 
     <xsl:apply-templates select="@*|*"/> 
    </xsl:copy> 
    </xsl:template> 

</xsl:stylesheet> 

Выход XML

<example> 
    <A Val="12"/> 
    <A Val="some a text more a text"> 
     <B Val="some b text"/> 
    </A> 
    <B/> 
</example> 
+0

вау, который прекрасно работает, спасибо ты так много – bdanger

Смежные вопросы