如何在XSLT 2.0中获取重复元素

时间:2015-03-01 10:48:24

标签: xml xslt

我希望针对每个产品在以下XML结构中获得重复的“Author”元素。我该怎么办?我使用以下在线工具进行测试 http://xslttest.appspot.com/

XML

<OrderDocument>
  <OrderProduct>
    <Product>
      <ProductDescription>ProductDescription</ProductDescription>
      <Author>Author</Author>
      <Author>Author</Author>
    </Product>
   </OrderProduct>  
   <OrderProduct>
    <Product>
      <ProductDescription>ProductDescription</ProductDescription>
      <Author>Author</Author>
      <Author>Author</Author>
    </Product>
   </OrderProduct>  
   <OrderProduct>
    <Product>
      <ProductDescription>ProductDescription</ProductDescription>
      <Author>Author</Author>
      <Author>Author</Author>
    </Product>
   </OrderProduct>      
</OrderDocument>

XSLT文件:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"  version="1.0">
  <xsl:template match="//OrderDocument">


   </xsl:template>
</xsl:stylesheet>

需要输出:

<Message>
 <Product>
           <Author>Author</Author>
          <Author>Author</Author>
 </Product>
  <Product>
           <Author>Author</Author>
          <Author>Author</Author>
 </Product>
</Message>

1 个答案:

答案 0 :(得分:4)

对于不更改整个XML文档的转换,通常从XSLT identity template

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

然后,您只需要为希望转换的节点编写模板。查看您的输入和预期输出,您需要做三件事

OrderDocument元素重命名为Message 删除OrderProduct元素,但继续处理其子元素 完全删除ProductDescription元素

每个都可以通过单独的模板实现。试试这个XSLT

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

    <!-- Rename OrderDocument to Message -->
    <xsl:template match="OrderDocument">
        <Message>
            <xsl:apply-templates/>
        </Message>
    </xsl:template>

    <!-- Remove OrderProduct, but keep processing its children -->
    <xsl:template match="OrderProduct">
        <xsl:apply-templates/>
    </xsl:template>

    <!-- Remove ProductDescription entirely -->
    <xsl:template match="ProductDescription" />

    <!-- Identity Template for everything else -->
    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>