如何根据特定规则跳过(根本不处理)某些XSLT元素?

时间:2016-12-06 19:42:18

标签: xml xslt xslt-1.0

我有XML例如:

<?xml version="1.0"?>
<data>
<element>
 <A>192.168.188.100</A>
 <B>/shelf=1</B>
</element>
<element>
 <A>192.168.188.100</A>
 <B>/slot=1</B>
</element>
<element>
 <A>192.168.188.23</A>
 <B>/port=client:1:3:1-2</B>
</element>
</data>

我的XSLT映射有效:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"  xmlns:max="http://www.ibm.com/maximo">

<xsl:output method="xml" encoding="UTF-8" indent="yes"/>
<xsl:template match="/"> 
    <max:SyncCIDW>
    <max:CIDWSet>
    <xsl:apply-templates select="data/element" />
    </max:CIDWSet>
    </max:SyncCIDW>
</xsl:template> 

  <xsl:template match="element"> 
    <max:CI>
        <max:CINUM><xsl:value-of select="A"/></max:CINUM>
    </max:CI>
  </xsl:template>

</xsl:stylesheet>

如何跳过元素,根本不将其添加到我的映射中,只有当元素以&#34; / port =&#34;? 那么在这个例子中,只应通过XSLT处理第三个元素?

谢谢

1 个答案:

答案 0 :(得分:1)

这是一种方式:

<xsl:apply-templates select="data/element[starts-with(B,'/port')]" />

仅选择那些B子节点的文本以/port开头的元素。

您的element模板中存在错误:

<max:CINUM><xsl:value-of select="ip"/></max:CINUM>
                                 ^^

没有名为ip的子节点,或许您打算使用A

以下样式表:

<xsl:stylesheet version="1.0"  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"  xmlns:max="http://www.ibm.com/maximo">

    <xsl:output method="xml" encoding="UTF-8" indent="yes"/>
    <xsl:template match="/"> 
        <max:SyncCIDW>
            <max:CIDWSet>
                <xsl:apply-templates select="data/element[starts-with(B,'/port')]" />
            </max:CIDWSet>
        </max:SyncCIDW>
    </xsl:template> 

    <xsl:template match="element"> 
        <max:CI>
            <max:CINUM><xsl:value-of select="A"/></max:CINUM>
        </max:CI>
    </xsl:template>

</xsl:stylesheet>

生成此输出:

<?xml version="1.0" encoding="UTF-8"?>
<max:SyncCIDW xmlns:max="http://www.ibm.com/maximo">
   <max:CIDWSet>
      <max:CI>
         <max:CINUM>192.168.188.23</max:CINUM>
      </max:CI>
   </max:CIDWSet>
</max:SyncCIDW>