1

これが私のxsltです:

これは機能しますが、ハードコード「1,2」の場合のみです。

<xsl:template match="row[contains('1,2,',concat(position(),','))]" 

作業中のxslt:

<xsl:stylesheet version="1.0" exclude-result-prefixes="msxsl" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt">
    <xsl:output method="xml" indent="yes"/>
    <xsl:param name="positions"/>
    <xsl:template match="@* | node()">
        <xsl:copy>
            <xsl:apply-templates select="@* | node()"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="row[contains('1,2,',concat(position(),','))]" name="skiprow"/>
</xsl:stylesheet>

しかし、位置の値をパラメーターとして渡したいです。しかし、うまくいきません。行を追加してパラメーターの値を確認しましたが、パラメーターは良好です。

    <xsl:value-of select="$positions"/>
    <xsl:copy>
        <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>

動作しない xslt:

<xsl:stylesheet version="1.0" exclude-result-prefixes="msxsl" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt">
    <xsl:output method="xml" indent="yes"/>
    <xsl:param name="positions"/>
    <xsl:template match="@* | node()">
        <xsl:copy>
            <xsl:apply-templates select="@* | node()"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="row[contains('$positions',concat(position(),','))]" name="skiprow"/>
</xsl:stylesheet>

サンプル XML:

<root>
    <row>
        <column1>7004275</column1>
        <column2>NUVCFDK</column2>
    </row>
    <row>
        <column1>1001459</column1>
        <column2>CAN</column2>
        <column3>12</column3>
        <column4>646.80</column4>
        <column5>23-06-2009</column5>
        <column6>31-12-2009</column6>
        <column7/>
    </row>
    <row>
        <column1>1001461</column1>
        <column2>CAN</column2>
        <column3>1</column3>
        <column4>9.50</column4>
        <column5>23-06-2009</column5>
        <column6>31-12-2009</column6>
        <column7/>
    </row>
</root>
4

1 に答える 1

3

動作しない xslt:

  <xsl:template match="row[contains('$positions',concat(position(),','))]" name="skiprow"/>

XSLT 1.0 では、一致パターンに変数/パラメーター参照を含めることは禁止されています。

代わりに使用してください:

<xsl:template match="row>
  <xsl:if test=
      "not(contains($vPositions, concat(position(),',')))">
   <xsl:call-template name="identity"/>
  <xsl:if>
</xsl:template>

完全な変換は次のようになります。

<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="vPositions" select="'1,2,'"/>

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

 <xsl:template match="row">
  <xsl:if test=
   "not(contains($vPositions, concat(position(),',')))">
    <xsl:call-template name="identity"/>
  </xsl:if>
 </xsl:template>
</xsl:stylesheet>

この変換が提供された XML ドキュメントに適用されると、次のようになります。

<root>
    <row>
        <column1>7004275</column1>
        <column2>NUVCFDK</column2>
    </row>
    <row>
        <column1>1001459</column1>
        <column2>CAN</column2>
        <column3>12</column3>
        <column4>646.80</column4>
        <column5>23-06-2009</column5>
        <column6>31-12-2009</column6>
        <column7/>
    </row>
    <row>
        <column1>1001461</column1>
        <column2>CAN</column2>
        <column3>1</column3>
        <column4>9.50</column4>
        <column5>23-06-2009</column5>
        <column6>31-12-2009</column6>
        <column7/>
    </row>
</root>

必要な正しい結果が生成されます (行 1 と 2 が「削除」されます)。

<root>
   <row>
      <column1>1001461</column1>
      <column2>CAN</column2>
      <column3>1</column3>
      <column4>9.50</column4>
      <column5>23-06-2009</column5>
      <column6>31-12-2009</column6>
      <column7/>
   </row>
</root>

ただし、条件が十分に強力ではないことに注意してください。パラメータ値を にすると、1、11、3、13 の4 つの"11,13,"行が削除されます。

使用するのに適した条件は次のとおりです。

not(contains($vPositions, concat(',',position(),',')))

つまり、パラメーターはコンマ文字で開始および終了する必要があります。

修正された完全な変換は次のとおりです。

<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="vPositions" select="',1,2,'"/>

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

 <xsl:template match="row">
  <xsl:if test=
   "not(contains($vPositions, concat(',',position(),',')))">
    <xsl:call-template name="identity"/>
  </xsl:if>
 </xsl:template>
</xsl:stylesheet>
于 2012-08-20T03:27:01.340 に答える