xslt匹配标记不同的名称

时间:2011-02-17 11:37:29

标签: xml xslt

         <xsl:for-each select ="block4">
            <xsl:choose>
                <xsl:when test="tag[name = '57A']">
                    <xsl:value-of select="value"/>
                </xsl:when>
                <xsl:when test="tag[name = '57D'] ">
                    <xsl:value-of select="value"/>
                </xsl:when>
            </xsl:choose>,<xsl:text/>
        </xsl:for-each>

我已经像这样写了我的xslt。这个xml不能正常工作:

<tag>
  <name>57A</name> 
  <value>NORTESMM</value> 
</tag>

有时标签的名称会发生​​变化。它应该是 57A 57D ,如上面的XSLT所示。但它没有产生正确的结果。

5 个答案:

答案 0 :(得分:0)

将您的选择更改为:

<xsl:value-of select="tag/value"/>

完成计划:

<强> XML:

<blocks>
  <block4>
    <tag>
      <name>57A</name>
      <value>NORTESMM</value>
    </tag>
  </block4>
  <block4>
    <tag>
      <name>57D</name>
      <value>FOO</value>
    </tag>
  </block4>
</blocks>

<强> XSL:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="blocks">
    <xsl:for-each select="block4">
      <xsl:choose>
        <xsl:when test="tag[name = '57A']">
          <xsl:value-of select="tag/value"/>
        </xsl:when>
        <xsl:when test="tag[name = '57D'] ">
          <xsl:value-of select="tag/value"/>
        </xsl:when>
      </xsl:choose>,<xsl:text/>
    </xsl:for-each>
  </xsl:template>
</xsl:stylesheet>

<强>输出:

NORTESMM,FOO

答案 1 :(得分:0)

试试这个

<xsl:for-each select ="block4">
<xsl:choose>
  <xsl:when test="tag/name = '57A'">
      <xsl:value-of select="tag/value"/>
  </xsl:when>
  <xsl:when test="tag/name = '57D'">
      <xsl:value-of select="tag/value"/>
  </xsl:when>
</xsl:choose>
</xsl:for-each>

您可以使用简单的XML测试XSLT,创建两个文件test.xsl和data.xml,然后在Firefox中打开data.xml,例如:

data.xml中

<?xml-stylesheet type="text/xsl" href="test.xsl"?> 
 <tag>
 <name>57A</name>
 <value>NORTESMM</value>
 </tag>

test.xsl

<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:template match="/">
        <html xmlns="http://www.w3.org/1999/xhtml">
            <head>
                <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
                <title></title>
            </head>
            <body>
            <xsl:for-each select ="block4">
            <xsl:choose>
                <xsl:when test="tag/name = '57A'">
                    <xsl:value-of select="tag/value"/>
                </xsl:when>
                <xsl:when test="tag/name = '57D'">
                    <xsl:value-of select="tag/value"/>              
                </xsl:when>
            </xsl:choose>
            </xsl:for-each>
            </body>
        </html>
    </xsl:template></xsl:stylesheet>

答案 2 :(得分:0)

<xsl:template match="block4/tag">
  <xsl:if test="name='57A' or name='57D'">
    <xsl:value-of select="value"/>
  </xsl:if>
  </xsl:text>, <xsl:text/>
</xsl:template>

它可能会有所不同,具体取决于<block4><tag>代码的结构。

无论如何,我建议您learn XSLT首先,至少是基础知识,然后再使用它。

答案 3 :(得分:0)

这是XSLT中最短和最“精神”的解决方案:

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

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

 <xsl:template match="tag[name='57A']">value1 </xsl:template>
 <xsl:template match="tag[name='57D']">value2 </xsl:template>
</xsl:stylesheet>

应用于此XML文档时

<t>
    <tag>
        <name>57A</name>
        <value>NORTESMM</value>
    </tag>
    <tag>
        <name>57D</name>
        <value>NORTESMM</value>
    </tag>
</t>

产生了想要的正确结果:

value1 value2 

请注意

  1. 我们使用并覆盖身份规则。这是最基本,最强大的XSLT设计模式。

  2. 我们不使用<xsl:for-each>,也不使用XSLT条件说明

  3. 解决方案2

    <xsl:stylesheet version="1.0"
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
     xmlns:my="my:my">
     <xsl:output method="text"/>
     <xsl:strip-space elements="*"/>
    
     <my:values>
      <val tagname="57A">value1 </val>
      <val tagname="57B">value2 </val>
      <val tagname="57C">value3 </val>
      <val tagname="57D">value4 </val>
      <val tagname="57E">value5 </val>
     </my:values>
    
     <xsl:variable name="vVals" select=
       "document('')/*/my:values/*"/>
    
     <xsl:template match="node()|@*">
         <xsl:copy>
           <xsl:apply-templates select="node()|@*"/>
         </xsl:copy>
     </xsl:template>
    
     <xsl:template match="tag">
      <xsl:value-of select="$vVals[@tagname=current()/name]"/>
     </xsl:template>
    </xsl:stylesheet>
    

    当应用于同一个XML文档(上图)时,会再次生成所需的正确结果

    value1 value4 
    

    请注意:当我们想要处理tag/name的许多不同可能值时,可以使用此解决方案。我们使用表格来匹配值,只使用一个覆盖模板。

答案 4 :(得分:-1)

<xsl:for-each select ="block4">
            <xsl:choose>
                <xsl:when test="tag/name = '57A'">
                    <xsl:value-of select="value"/>
                </xsl:when>
                <xsl:when test="tag/name = '57D'">
                    <xsl:value-of select="value"/>
                </xsl:when>
            </xsl:choose>,<xsl:text/>
</xsl:for-each>