2017-01-27 39 views
0

我需要用style="width:<>; height:<>;替換獨立屬性width="<>"height="<>"在HTML文件中將XML屬性移動到style =「」

典型輸入以下

<img width="32pt" alt="PIC" class="graphics" height="32pt" src="images/about.png"/> 

這樣的結果應該是

<img style="width:32pt; height:32pt;" alt="PIC" class="graphics" src="images/about.png"/> 

的問題是,我從來沒有與XSL工作過。

我知道的,因爲到目前爲止,是

這可以趕上img元素

<xsl:template match="xh:img"> 

這可以趕上width屬性

<xsl:template match="@width"> 

,我知道如何添加屬性或元素。 但我不知道如何存儲widthheight的值,並將它們寫入一行。 任何幫助,將不勝感激。

回答

1

你可以使用:

<xsl:template match="img"> 
    <img style="width:{@width}; height:{@height};"> 
     <xsl:copy-of select="@*[not(name()='width' or name()='height')]"/> 
    </img> 
</xsl:template> 

這是假設每img既有widthheight屬性,並沒有子節點。如果源XML將img元素放置在命名空間中(未在您的問題中顯示),請將適當的前綴添加到模板的匹配模式。

僅供參考,請參閱:https://www.w3.org/TR/xslt/#attribute-value-templates

+0

非常感謝!我不得不修復'not()'的「)」,把它放在最後,但它可以工作。 – marco

+0

好抓 - 現在修好了。 –

0

您(或其他讀者)可能有興趣在更一般的(XSLT 2.0)從生產樣式表採取的解決方案:

<xsl:template name="style-attributes"> 
    <xsl:choose> 
     <xsl:when test="@style | @class"> 
     <xsl:copy-of select="@style | @class"/> 
     </xsl:when> 
     <xsl:when test="@*[f:is-style-attribute(.)]"> 
     <xsl:attribute name="style"> 
      <xsl:for-each select="@*[f:is-style-attribute(.)]"> 
      <xsl:if test="position() gt 1">; </xsl:if> 
      <xsl:apply-templates select="." mode="style-attribute"/> 
      </xsl:for-each> 
     </xsl:attribute> 
     </xsl:when> 
    </xsl:choose> 
    </xsl:template> 

    <xsl:function name="f:is-style-attribute" as="xs:boolean"> 
    <xsl:param name="att" as="attribute(*)"/> 
    <xsl:variable name="n" select="local-name($att)"/> 
    <xsl:sequence select="namespace-uri($att) = '' and $n = ('class', 'style', 'border', 'width', 'cellspacing', 'padding', 'cellpadding', 'align', 'valign')"/> 
    </xsl:function> 

    <xsl:function name="f:units" as="xs:string"> 
    <xsl:param name="value" as="xs:string"/> 
    <xsl:sequence select="if ($value castable as xs:integer) then concat($value, 'px') else $value"/> 
    </xsl:function> 

    <xsl:template match="@border" mode="style-attribute">border:<xsl:value-of select="f:units(.)"/> solid</xsl:template> 
    <xsl:template match="@width" mode="style-attribute">width:<xsl:value-of select="f:units(.)"/></xsl:template> 
    <xsl:template match="@align" mode="style-attribute">text-align:<xsl:value-of select="."/></xsl:template> 
    <xsl:template match="@valign" mode="style-attribute">vertical-align:<xsl:value-of select="."/></xsl:template> 
    <xsl:template match="@cellspacing" mode="style-attribute">border-spacing:<xsl:value-of select="."/></xsl:template> 
    <xsl:template match="@padding" mode="style-attribute">padding:<xsl:value-of select="f:units(.)"/></xsl:template> 
    <xsl:template match="@cellpadding" mode="style-attribute">padding:<xsl:value-of select="f:units(.)"/></xsl:template> 
    ... etc (as required) 
相關問題