-1

間違いなく、XSLTで成功することは決してありません...

これが私が持っているものです:

   <par font="Arial" size="24">text 24</par>
   <par font="Arial" size="12">text 12</par>
   <par font="Times New Roman" size="12">text times 12</par>

そして、これが私が欲しいものです:

   <font style="font-family:Arial"><font style="font-size:24">text 24</font></font>
   <font style="font-family:Arial"><font style="font-size:12">text 12</font></font>
   <font style="font-family:Times New Roman"><font style="font-size:12">text times 12</font></font>

もちろん、このようなものも良いですが、私にとってこの解決策はもっと複雑に思えます:

<font style="font-family:Arial;font-size:24">text 24</font>
<font style="font-family:Arial;font-size:12">text 12</font>
<font style="font-family:Times New Roman;font-size:12">text times 12</font>

サイズやフォントごとにコードを指定する必要があると思います(間違っているかもしれませんが)。私のxmlで使用できるサイズとフォントはごくわずかなので、これは問題ではありません。

あなたの助けに感謝します、私は自分でそれをやろうとして髪を失い始めます...

4

2 に答える 2

3

次のようなことができます。

XML 入力(整形式に変更)

<doc>
    <par font="Arial" size="24">text 24</par>
    <par font="Arial" size="12">text 12</par>
    <par font="Times New Roman" size="12">text times 12</par>   
</doc>

XSLT1.0

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

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

    <xsl:template match="doc">
        <html>
            <xsl:apply-templates/>
        </html>
    </xsl:template>

    <xsl:template match="par">
        <font>
            <xsl:attribute name="style">
                <xsl:apply-templates select="@*"/>
            </xsl:attribute>
            <xsl:apply-templates select="node()"/>
        </font>
    </xsl:template>

    <xsl:template match="par/@size">
        <xsl:value-of select="concat('font-size: ',.,';')"/>
    </xsl:template>
    <xsl:template match="par/@font">
        <xsl:value-of select="concat('font-family: ',.,';')"/>
    </xsl:template>

</xsl:stylesheet>

出力

<html>
   <font style="font-family: Arial;font-size: 24;">text 24</font>
   <font style="font-family: Arial;font-size: 12;">text 12</font>
   <font style="font-family: Times New Roman;font-size: 12;">text times 12</font>
</html>

また、or属性がある場合にのみ出力したい場合は、 match="par"toを変更できます。match="par[@font or @size]"<font>fontsize

于 2012-07-25T15:22:02.047 に答える
0

DevNull おめでとうございます。彼が最初の正解でした。ジェームズの答えは間違っています。

ここでは非常に衒学的に述べていますが、実際の最も簡単で厳密な解決策は .... <drumroll/>.... です。

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/>

<xsl:template match="/">
 <xsl:for-each select="*/par">
  <font style="{ string-join(
   for $a in (@size|@font) return
     concat('font-', if ($a except @font) then 'size' else 'family', ':', $a),
     ';')}">
   <xsl:copy-of select="node()"/>
  </font>
 </xsl:for-each>
</xsl:template>

</xsl:stylesheet>

上記の XSLT 2.0 スタイルシートは、この入力を変換します ...

<doc>
    <par font="Arial" size="24">text 24</par>
    <par font="Arial" size="12">text 12</par>
    <par font="Times New Roman" size="12">text times 12</par>   
    <par font="Courier">No size specified!</par>   
    <par size="16">No font specified!</par>   
</doc>

... この出力に ...

<font style="font-family:Arial;font-size:24">text 24</font>
<font style="font-family:Arial;font-size:12">text 12</font>
<font style="font-family:Times New Roman;font-size:12">text times 12</font>
<font style="font-family:Courier">No size specified!</font>
<font style="font-size:16">No font specified!</font>

1 つの小さなテンプレートで、style 属性値に不要なセミコロンはありません!

必要な XSLT バージョンについては言及されていません。したがって、OP が XSLT 1.0 上にある場合、このソリューションは OP にとって役に立たない可能性があります。

于 2012-07-25T16:34:54.933 に答える