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>

但是请注意,您的条件不够强- 参数值"11,13,"将删除四行- 1、11、3 和 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 回答