2015-12-06 59 views
0

我製作了一個xslt腳本,它將採用任何xml腳本並將元素內的文本節點轉換爲這些元素的屬性。元素只會有子元素或者文本節點,但不會必須xslt將文本節點轉換爲屬性

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

應該結束了看上去像屬性或其他任何如:

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

這裏是我的腳本,它基本上有兩個IFS稱,如果元素有一個文本節點作出新的元素具有相同的名稱,但要文中另有一個屬性,如果它並不只是複製的元素

<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> 

xml將比我的例子更復雜。

+0

您的實際XML是否有任何混合內容(包含文本和元素子元素的元素)?如果是這樣,那麼應該如何處理? –

+0

是它,文本應成爲父母的屬性 – bdanger

+0

所以'一些文本幾類B文字多個文本''變得「'或?? –

回答

1

而不是做一個xsl:for-each(拉法),我會使用推方式的......

XML輸入

<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