xslt处理的性能问题

xslt处理的性能问题,xslt,Xslt,我有父标记和子标记结构,需要迭代父标记的子标记,并以新格式设置值 可以为父标记和子标记重复属性 我们需要检查值/标记是否存在于子标记中,然后获取它,否则从父标记获取它 下面是示例xml <?xml version="1.0" encoding="UTF-8"?> <item> <perishable-indicator >N</perishable-indicator> <product-shelf-security-type >

我有父标记和子标记结构,需要迭代父标记的子标记,并以新格式设置值

可以为父标记和子标记重复属性

我们需要检查值/标记是否存在于子标记中,然后获取它,否则从父标记获取它

下面是示例xml

<?xml version="1.0" encoding="UTF-8"?>
<item>
  <perishable-indicator >N</perishable-indicator>
  <product-shelf-security-type >ST - SMALL TOY</product-shelf-security-type>
  <before-date>2012-05-30</before-date>
  <partnumber>2</partnumber>
  <season>BASIC SEASON</season>
  <variant>
   <partnumber>4</partnumber>
   <season>BASIC SEASON</season>
   <division-code>055</division-code>
   <department-code>013</department-code>
   <class-code>089</class-code>
  </variant>
</item>

N
小玩具
2012-05-30
2.
基本季节
4.
基本季节
055
013
089
下面是我用来迭代父级和子级的XSLT示例:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" omit-xml-declaration="yes" indent="yes"/> 
<xsl:template match="item">
<Product>
    <xsl:variable name="productperishable" select="perishable-indicator"/>
    <xsl:variable name="productsecurity-type" select="product-shelf-security-type"/>
    <xsl:variable name="productbefore-date" select="before-date"/>
    <xsl:variable name="productpartnumber" select="partnumber"/>
    <xsl:variable name="productseason" select="season"/>
<xsl:for-each select="variant">
<sku>
 <xsl:choose>
 <xsl:when test="partnumber">
 <PartNumber><xsl:value-of select="partnumber"/></PartNumber>
 </xsl:when>
 <xsl:when test="$productpartnumber!=''">                       
 <PartNumber><xsl:value-of select="$productpartnumber"/></PartNumber>                       
 </xsl:when>
 </xsl:choose>
<xsl:choose>
 <xsl:when test="perishable-indicator">
 <PartNumber><xsl:value-of select="perishable-indicator"/></PartNumber>
 </xsl:when>
 <xsl:when test="$productperishable!=''">                       
 <Perishable><xsl:value-of select="$productperishable"/></Perishable>                       
 </xsl:when>
 </xsl:choose>
</sku>
</xsl:for-each>
</Product>
</xsl:template>
</xsl:stylesheet>


但是,如果我们需要迭代输入xml中存在的多个项和变量,转换过程将花费大量时间。任何输入都会有很大帮助。

所示的编码技术将执行很长时间,因为XSLT引擎被迫使用编码循环,而不是使用内置的渲染引擎,许多值首先复制到变量中,而不是立即复制到输出流中

注意:当使用另一种编码技术时,xslt呈现引擎将自动循环所有元素。将XSLT视为渲染引擎的规范,而不是编程语言。在这种编码技术中,
(而不是
)告诉呈现引擎继续使用它在实际上下文中遇到的任何XML标记

默认XSLT模板创建输入的精确副本:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml"/>

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

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

</xsl:stylesheet>

如您所见,此样式表中没有
命令。您可以使用此规范创建编译后的XSLT呈现,并检查运行时中的差异

现在可以添加转换模板了

如果我正确理解您的规格,您希望添加

<xsl:template match="item">
   <Product>
      <xsl:apply-templates select="variant"/>
   </Product>   
</xsl:template>

<xsl:template match="variant">
   <sku>
      <xsl:choose>
         <xsl:when test="partnumber != ''">
            <xsl:apply-templates select="partnumber"/>
         </xsl:when>
         <xsl:otherwise>
            <xsl:apply-templates select="../partnumber"/>
         </xsl:otherwise>
      </xsl:choose>
      <xsl:choose>
         <xsl:when test="perishable-indicator!= ''">
            <xsl:apply-templates select="perishable-indicator"/>
         </xsl:when>
         <xsl:otherwise>
            <xsl:apply-templates select="../perishable-indicator"/>
         </xsl:otherwise>
      </xsl:choose>
   </sku>   
</xsl:template>

这应该包括基本内容。用这个规范编译一个xslt处理器,并告诉我这是否比您当前的处理速度更快

接下来,为了与输出规范完全兼容,您应该再创建两个格式模板来重命名生成的标记:

<xsl:template match="partnumber">
   <PartNumber>
      <xsl:apply-templates/>
   </PartNumber>
</xsl:template>

<xsl:template match="perishable-indicator">
   <Perishable>
      <xsl:apply-templates/>
   </Perishable>
</xsl:template>

这将创建输出

<document>
   <Product>
      <sku>
         <PartNumber>4</PartNumber>
         <Perishable>N</Perishable>
      </sku>
   </Product>
</document>

4.
N

您能解释一下您的XSLT在这里做什么吗?我只能在
零件号
易腐指示灯
上看到
时的
。。这仅仅是关于这两个元素吗?这只是两个元素的一个例子,我们有将近40-50个元素用于父标记和子标记。您说过您必须迭代几个
项。。我只能在XML中看到1个
(根元素)。。你能描述一下实时场景吗?对不起,但是我很难粘贴整个内容,场景是有多个标记,每个标记都有多个@Ravi:你的实际XML文件大小是多少?XSL文件中没有什么奇怪的地方可以证明需要花费大量的处理时间。