使用xslt获取xml的第一个块的标记名称

时间:2013-01-04 07:59:34

标签: xml xslt

我有一个非常大的xml,其中一个块不断重复。现在我只想要第一个块的标签名称。我在xsl中很差。我试过但是徒劳。请任何人帮忙。 我的xml如下所示,

<catalog>
<product>
<title>GATE MCQ For Electronics &amp; Communication Engineering</title>
<originalprice>Rs 680</originalprice>
<sellingprice>Rs 680Rs 530</sellingprice>
<discount>22% Off</discount>
<payment>Cash on delivery available</payment>
<review/>
</product>
<product>
<title>Gate Guide Computer Science / Information Technology (with CD)</title>
<originalprice>Rs 695</originalprice>
<sellingprice>Rs 695Rs 480</sellingprice>
<discount>31% Off</discount>
<payment>Cash on delivery available</payment>
<review/>
</product>

产品块不断重复,但值不同。 我现在使用的xsl是,

<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
            xmlns="http://www.java2s.com"
            xmlns:xsd="http://www.w3.org/2000/10/XMLSchema"
            version="1.0">

<xsl:output method="xml" indent="yes"/>

<xsl:template match="//*[local-name() = 'product'][1]/*">

<xsl:value-of select="name()"/>
</xsl:template>

</xsl:stylesheet>

输出结果是,

    title
    originalprice
    sellingprice
    discount
    payment 
    review 


   Gate Guide Computer Science / Information Technology (with CD)
   Rs 695
   Rs 695Rs 480
   31% Off
   Cash on delivery available

但是必需的输出是,

    title
    originalprice
    sellingprice
    discount
    payment 
    review 

谢谢。

3 个答案:

答案 0 :(得分:2)

您需要从根开始创建模板(通过匹配'/'),然后使用'apply-templates'限制您想要处理的元素,如下所示:

<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
            xmlns="http://www.java2s.com"
            xmlns:xsd="http://www.w3.org/2000/10/XMLSchema"
            version="1.0">
  <xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/>
  <xsl:template match="/">
    <xsl:apply-templates select="/catalog/product[position() = 1]"/>
  </xsl:template>
  <xsl:template match="product">
    <xsl:for-each select="./*">
      <xsl:value-of select="name()"/>
      <xsl:text>
      </xsl:text>
    </xsl:for-each>
  </xsl:template>
</xsl:stylesheet>

这将产生所需的输出......

答案 1 :(得分:2)

就这么简单

<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="product[1]/*">
     <xsl:value-of select="concat(name(), '&#xA;')"/>
 </xsl:template>
 <xsl:template match="text()"/>
</xsl:stylesheet>

在提供的XML文档上应用此转换时:

<catalog>
    <product>
        <title>GATE MCQ For Electronics &amp; Communication Engineering</title>
        <originalprice>Rs 680</originalprice>
        <sellingprice>Rs 680Rs 530</sellingprice>
        <discount>22% Off</discount>
        <payment>Cash on delivery available</payment>
        <review/>
    </product>
    <product>
        <title>Gate Guide Computer Science / Information Technology (with CD)</title>
        <originalprice>Rs 695</originalprice>
        <sellingprice>Rs 695Rs 480</sellingprice>
        <discount>31% Off</discount>
        <payment>Cash on delivery available</payment>
        <review/>
    </product>
</catalog>

产生了想要的正确结果:

title
originalprice
sellingprice
discount
payment
review

答案 2 :(得分:1)

"//*"是“所有节点从root开始”,你可能想要更严格的XPath,如“/ catalog / product / *”(或类似于local-name函数,如果你不想处理名称空间正确)。