1

色を変更するために与えられたxslファイル

 <xsl:if test="!colorChanges()">
    <StaticLabel style="{StaticLabel/@style}">                                                                                                      
      <Caption>
    <xsl:value-of select="$StaticLabel/Caption"/>                               
      </Caption>                                                          
      <PreviewCaption>
         <xsl:value-of select="$StaticLabel/Caption"/>
       </PreviewCaption>                                                                                                                  
     </StaticLabel>
  </xsl:if>

このxmlデータを考えると

 <StaticLabel style="font-family:Arial;color:#000000;font-size:9pt">
    <Caption><![CDATA[FoodType]]></Caption>
    <Name><![CDATA[French]]></Name>
 </StaticLabel>
</xsl:if>

xslt後の現在の結果

<StaticLabel style="font-family:Arial;color:#000000;font-size:9pt">                                                  
   <Caption>Food Type</Caption>                                                 
   <PreviewCaption>French</PreviewCaption>                                              
</StaticLabel>

とにかく、xmlファイルを更新せずにxsltを実行する前に、他のスタイル属性を保持したまま色を変更するだけですか

期待される結果:

<StaticLabel style="font-family:Arial;color:#CCCCCC;font-size:9pt">                                                  
   <Caption>Food Type</Caption>                                                 
   <PreviewCaption>French</PreviewCaption>                                              
</StaticLabel>

可能なXSLソリューション

<xsl:if test="colorChanges()">
    <StaticLabel>       
      <xsl:attribute name="style">                                                        
        //other style attributes stay same and ONLY edit color 
    <xsl:text>color:#CCCCCC"</xsl:text>
  </xsl:attribute>                                                                                              
      <Caption>
    <xsl:value-of select="$StaticLabel/Caption"/>                               
      </Caption>                                                          
      <PreviewCaption>
         <xsl:value-of select="$StaticLabel/Caption"/>
       </PreviewCaption>                                                                                                                  
     </StaticLabel>
  </xsl:if>
4

1 に答える 1

0

I. XSLT 1.0 ソリューション:

この一般的な変換:

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

 <xsl:param name="pStyle" select="'font-size:12pt'"/>

 <xsl:variable name="vStyleName"
      select="concat(';',substring-before($pStyle, ':'),':')"/>

 <xsl:variable name="vCurrentStyleValue" select=
 "substring-before(substring-after(concat(';', /*/@style, ';'), $vStyleName),
                   ';')"/>

  <xsl:variable name="vCurrentStyle"
       select="concat($vStyleName,$vCurrentStyleValue)"/>
 <xsl:template match="node()|@*" name="identiy">
  <xsl:copy>
   <xsl:apply-templates select="node()|@*"/>
  </xsl:copy>
 </xsl:template>

 <xsl:template match="/*/@style">
  <xsl:attribute name="style">
   <xsl:variable name="vprecStyles" select=
   "substring-before(concat(';',., $vCurrentStyle), $vCurrentStyle)"/>
   <xsl:value-of select="substring($vprecStyles, 2)"/>
   <xsl:if test="$vprecStyles">;</xsl:if>
   <xsl:value-of select="$pStyle"/>
   <xsl:value-of select="substring-after(concat(';',.), $vCurrentStyle)"/>
  </xsl:attribute>
 </xsl:template>
</xsl:stylesheet>

提供された XML ドキュメントに適用した場合:

<StaticLabel style="font-family:Arial;color:#000000;font-size:9pt">
   <Caption>Food Type</Caption>
   <PreviewCaption>French</PreviewCaption>
</StaticLabel>

必要な正しい結果が生成されます

<StaticLabel style="font-family:Arial;color:#CCCCCC;font-size:9pt">
   <Caption>Food Type</Caption>
   <PreviewCaption>French</PreviewCaption>
</StaticLabel>

$pStyleパラメータを次のように変更すると:

 <xsl:param name="pStyle" select="'font-family:Courier'"/>

再び、必要な正しい結果が生成されます。

<StaticLabel style="font-family:Courier;color:#000000;font-size:9pt">
   <Caption>Food Type</Caption>
   <PreviewCaption>French</PreviewCaption>
</StaticLabel>

$pStyleパラメータを次のように変更すると:

 <xsl:param name="pStyle" select="'font-size:12pt'"/>

再び正しい結果が得られます:

<StaticLabel style="font-family:Arial;color:#000000;font-size:12pt">
   <Caption>Food Type</Caption>
   <PreviewCaption>French</PreviewCaption>
</StaticLabel>

最後に、$pStyleパラメータを次のように変更すると:

 <xsl:param name="pStyle" select="'line-height:15pt'"/>

正しい望ましい結果が再び得られます

<StaticLabel style="font-family:Arial;color:#000000;font-size:9pt;line-height:15pt">
   <Caption>Food Type</Caption>
   <PreviewCaption>French</PreviewCaption>
</StaticLabel>

これは非常にエラー防止です -- 観察してください:

<StaticLabel style="font-family:Arial;background-color:#ffffff;color:#000000;font-size:9pt">
   <Caption>Food Type</Caption>
   <PreviewCaption>French</PreviewCaption>
</StaticLabel>

パラメータは次のようになり$pStyleます。

 <xsl:param name="pStyle" select="'color:#CCCCCC'"/>

それでも正しい結果が得られます (「色」で終わる他の CSS プロパティと混同されません):

<StaticLabel style="font-family:Arial;background-color:#ffffff;color:#CCCCCC;font-size:9pt">
   <Caption>Food Type</Caption>
   <PreviewCaption>French</PreviewCaption>
</StaticLabel>

Ⅱ.XSLT 2.0 ソリューション -- はるかに簡単:

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

 <xsl:param name="pStyle" select="'color:#CCCCCC'"/>

 <xsl:variable name="vStyleName" select=
                  "substring-before($pStyle, ':')"/>

 <xsl:variable name="vcurStyles"
      select="tokenize(/*/@style, ';')"/>

 <xsl:variable name="vnewStyles" select=
  "if($vcurStyles[substring-before(.,':') eq $vStyleName])
     then ($vcurStyles[substring-before(.,':') ne $vStyleName],
           $pStyle)
     else ($vcurStyles, $pStyle)
  "/>

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

 <xsl:template match="/*/@style">
  <xsl:attribute name="style" select="string-join($vnewStyles, ';')">
  </xsl:attribute>
 </xsl:template>
</xsl:stylesheet>
于 2012-10-11T20:56:12.437 に答える