2012-11-23 166 views
4

我是XSLT新手,所以這可能是非常基本的,但我真的很感激一些輸入。我需要在我的xml中轉換子節點,但同時保持父節點不變。我的XML看起來是這樣的:XSLT:如何複製父節點並轉換子節點

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<XMLTest xmlns:xsi="http://www.w3.org/2000/10/XMLSchema-instance" xmlns:jfxpf="http://www.xfa.com/schema/xml-package" xmlns:xfa="http://www.xfa.com/schema/xfa-data"> 
    <result form="10" version="4" resultid="23146" respondent="ycisxmir" authid="" date="2012-09-12 06:39:44" times="462"> 
     <Q0061 answerid="1">1</Q0061> 
     <Q0060 answerid="2">2</Q0060> 
     <QTXT1>1</QTXT1> 
    </result> 
</XMLTest> 

我需要保持兩個頂級節點的XMLTest和結果不變,而子節點需要被轉化爲一個更通用的格式是這樣的:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<XMLTest xmlns:xsi="http://www.w3.org/2000/10/XMLSchema-instance" xmlns:jfxpf="http://www.xfa.com/schema/xml-package" xmlns:xfa="http://www.xfa.com/schema/xfa-data"> 
    <result form="10" version="4" resultid="23146" respondent="ycisxmir" authid="" date="2012-09-12 06:39:44" times="462"> 
     <answer>Q0061</answer> 
     <id>1</id> 
     <value>1</value> 
     <answer>Q0060</answer> 
     <id>2</id> 
     <value>2</value> 
     <answer>QTXT1</answer> 
     <value>1</value> 
    </result> 
</XMLTest> 

我XSLT到目前爲止是這樣的:

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

    <xsl:template match="result/*"> 
     <answer><xsl:value-of select="local-name()"/></answer> 
     <id><xsl:value-of select="@answerid"/></id> 
     <value><xsl:value-of select="@*"/></value> 
    </xsl:template> 
</xsl:stylesheet> 

我使用XSL嘗試:複製頂部節點上,但不能讓它不失子節點,或子節點的改造工作。如何保持頂層節點並同時通過我的轉換後的子節點進行強制操作?

+0

不錯嘗試upvoted!只是你缺少身份模板哪些副本休息其他節點..檢查我的答案.. –

+0

我已經更新了答案與評論..請檢查它.. –

回答

2

開始

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

現在,添加模板供您需要即

012改造
+0

哦,他不需要一個空白節點,如果沒有屬性..! +1 –

+0

粉碎 - 這很有效!謝謝 :-) – Chrissy

1

你缺少身份模板:

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

我已經改正你回答..:

<?xml version="1.0" encoding="utf-8"?> 
<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="/XMLTest/result/*"> 
    <answer> 
     <xsl:value-of select="local-name()"/> 
    </answer> 
    <id> 
     <xsl:value-of select="@answerid"/> 
    </id> 
    <value> 
     <xsl:value-of select="@*"/> 
    </value> 
    </xsl:template> 


</xsl:stylesheet> 

EDIT1: 更新的模板丟棄,如果屬性是空的:一個if條件檢查如果在將其轉換爲元素之前屬性爲null ..

<xsl:template match="/XMLTest/result/*"> 
    <answer> 
     <xsl:value-of select="local-name()"/> 
    </answer> 
    <xsl:if test="@answerid/.!=''"> 
     <id> 
     <xsl:value-of select="@answerid"/> 
    </id> 
    </xsl:if> 
    <xsl:if test="@*/.!=''"> 
    <value> 
     <xsl:value-of select="@*"/> 
    </value> 
    </xsl:if> 
    </xsl:template> 

編輯2:在您的早期嘗試中,您試圖複製@ *的值,@*指示任何名稱的屬性,所以它正在複製@answerid的值(因爲這是唯一可用的屬性)。做的是.. valu-of="." ..請嘗試下面的代碼..

<xsl:template match="/XMLTest/result/*"> 
    <answer> 
     <xsl:value-of select="local-name()"/> 
    </answer> 
    <xsl:if test="@answerid/.!=''"> 
     <id> 
     <xsl:value-of select="@answerid"/> 
    </id> 
    </xsl:if> 
    <xsl:if test=".!=''"> 
    <value> 
     <xsl:value-of select="."/> 
    </value> 
    </xsl:if> 
    </xsl:template> 
+0

謝謝,這解決了我的問題!只是一個細節仍然不正確的代碼。如果子節點缺少answerid屬性,則標記值不會被填充。我如何正確編碼?我得到的是: QTXT1。 – Chrissy

+0

很高興知道..是的它是什麼?請去頭 –

+0

只是更新了我以前的評論那裏 – Chrissy