xslt处理的性能问题
我有父标记和子标记结构,需要迭代父标记的子标记,并以新格式设置值 可以为父标记和子标记重复属性 我们需要检查值/标记是否存在于子标记中,然后获取它,否则从父标记获取它 下面是示例xmlxslt处理的性能问题,xslt,Xslt,我有父标记和子标记结构,需要迭代父标记的子标记,并以新格式设置值 可以为父标记和子标记重复属性 我们需要检查值/标记是否存在于子标记中,然后获取它,否则从父标记获取它 下面是示例xml <?xml version="1.0" encoding="UTF-8"?> <item> <perishable-indicator >N</perishable-indicator> <product-shelf-security-type >
<?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文件中没有什么奇怪的地方可以证明需要花费大量的处理时间。