2017-06-16 69 views
0

將元素轉換爲屬性時我檢查父元素的名稱是否存在於我們試圖轉換爲屬性的元素中。將屬性與自定義邏輯不起作用的元素

例如planet_name是元素,它包含父元素(星球),因此需要將其作爲屬性進行轉換,否則原樣。

我寫的xslt,但它不工作可以任何人請幫助這個?提前致謝。

示例XML示例:

<world> 
      <planet> 
       <planet_name>solaris</plante_name> 
       <planet_number>23</plante_number> 
       <test>value1</test> 
      </planet> 
</world> 

預期輸出:

<world> 
      <planet planet_name="solaris" planet_number="23"> 
       <test>value1</test> 
      </planet> 
</world> 

XSLT如下

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

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

    <!--Match elements that contain children elements that don't contain children 
     elements themselves. --> 
    <xsl:template match="*[*[not(*)]]"> 
     <xsl:copy> 
      <xsl:for-each select="*"> 
       <xsl:variable name="attrName" select="name()" /> 
       <xsl:variable name="parentName" select="name(..)" /> 
       <xsl:choose> 
        <xsl:when test="contains(normalize-space($parentName),normalize-space($attrName))"> 
         <xsl:attribute name="{name()}"> 
          <xsl:value-of select="$parentName" /> 
         </xsl:attribute> 
        </xsl:when> 
        <xsl:otherwise> 
         <xsl:copy> 
          <xsl:apply-templates select="node()" /> 
         </xsl:copy> 
        </xsl:otherwise> 
       </xsl:choose> 
      </xsl:for-each> 
     </xsl:copy> 
    </xsl:template> 
</xsl:stylesheet> 
+0

您是否至少有一個格式良好的輸入示例,以便我們建議的任何XSLT都有機會處理輸入? –

+0

\t \t \t solaris的 \t \t 23 \t \t VALUE1 \t Bablu

+0

添加樣品孔形成XML。如果在xslt – Bablu

回答

0

我建議一個不同的方法:

XSLT 1.0

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

<xsl:template match="*"> 
    <xsl:copy> 
     <xsl:copy-of select="@*"/> 
     <xsl:apply-templates select="*[starts-with(name(), name(current()))]" mode="attr"/> 
     <xsl:apply-templates select="node()[not(starts-with(name(), name(current())))]"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="*" mode="attr"> 
    <xsl:attribute name="{name()}"> 
     <xsl:value-of select="." /> 
    </xsl:attribute> 
</xsl:template> 

</xsl:stylesheet> 
+0

中有任何錯誤,請幫忙,謝謝邁克爾。同時轉換爲屬性想要刪除父元素名稱,所以寫這行。這是否足夠..下劃線後需要字符串(_) – Bablu

+0

@Bablu這不會顯示在您的預期輸出中。如果你願意,你可以使用'substring-after(name(),'_')'(至少在給定的例子中)。 –

+0

我用過,但它不起作用,片段是 < xsl:attribute>' – Bablu

相關問題