使用XSLT从XML获取数据

时间:2013-08-21 10:38:20

标签: xml xslt xslt-1.0

我有一个XML文件来自存储过程文件的结果,如

<filters><TT TXT1="Electronics" /><TT TXT1="Computer" /><TT TXT1="HP" /></filters>

我通过XSLT中的存储过程得到这个

<xsl:variable name="p" select="get:GetProductFromId(get:UrlInformation()//productid)" />
    <xsl:text>» </xsl:text>
              <xsl:variable name="Breadcrumb" select="get:ExecStoredProcedure('kt_Brdcrumb',concat('@Dcat:',$p//defaultcategory))"></xsl:variable>
      <xsl:variable  name="Txt" select="XSLTHelper:FiltersToXML($Breadcrumb)">

      </xsl:variable>

我需要以下面的格式打印XML中的获取数据

Electronics >>  Computer >> HP

我试过这样的事情但是没有得到

 <xsl:for-each select="$Txt/Column1/TT">
             <xsl:value-of select="."/>
              </xsl:for-each>

有人可以帮忙吗?

2 个答案:

答案 0 :(得分:2)

您的示例不起作用的一个原因是Column1$Txt之间的TT

事后看来,我不确定为什么我在其他答案中使用了递归模板。以下解决方案产生相同的结果,并且更加简单。

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="text"/>

  <xsl:template match="filters">
    <xsl:apply-templates select="TT"/>
  </xsl:template>

  <xsl:template match="TT">
    <xsl:value-of select="@TXT1"/>
    <xsl:if test="position() != last()">
      <xsl:text> &gt;&gt; </xsl:text>
    </xsl:if>
  </xsl:template>

</xsl:stylesheet>

答案 1 :(得分:1)

使用此输入XML:

<filters>
   <TT TXT1="Electronics" />
   <TT TXT1="Computer" />
   <TT TXT1="HP" />
</filters>

以下XSL样式表:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="text"/>

  <xsl:template match="filters">
    <xsl:call-template name="print">
      <xsl:with-param name="items" select="TT"/>
    </xsl:call-template>
  </xsl:template>

  <!-- This template uses recursion on the list of TT elements to print them 
       one-by-one, treating the last one differently. -->
  <xsl:template name="print">
    <xsl:param name="items"/>
    <xsl:choose>
      <!-- Check that we have some items to print. -->
      <xsl:when test="not($items)"/>
      <xsl:otherwise>
        <xsl:value-of select="$items/@TXT1"/>
        <!-- If we haven't reached the last one yet, print a couple of
             greater-than signs and keep going. -->
        <xsl:if test="count($items) &gt; 1">
          <xsl:text> &gt;&gt; </xsl:text>
          <xsl:call-template name="print">
            <xsl:with-param name="items" select="$items[not(position()=1)]"/>
          </xsl:call-template>
        </xsl:if>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:template>
</xsl:stylesheet> 

生成此输出文本:

Electronics >> Computer >> HP