【问题标题】:Counting the number of times an xslt transform is done计算 xslt 转换完成的次数
【发布时间】:2014-12-30 19:14:03
【问题描述】:

出于政治原因,客户希望我实现一种方法来计算以通用方式在 xml 文档上完成的 xslt 转换的数量,而不是另一种方式。我意识到一旦根据一些论坛初始化变量就无法更改,但如果我理解正确,可以使用模板来解决。虽然,我很难理解它。

将有 3 种不同类型的计数器:添加、修改和删除。我想将计数输出到某种文件。我猜想这样做的一种方法是在第一个 xslt 的基础上使用第二个 xslt。但我有时间了解如何使用 xslt 进行计数。

原来的变换看起来像这样

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

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

<!--  <xsl:template match="is_gone|@value"/>  -->
<xsl:template match="is_gone"/>

<!-- Adding an element -->
<xsl:template match="viral_desc">
      <xsl:copy-of select="."/>
      <blarg_group>17</blarg_group>
</xsl:template>


<!-- modification -->
   <xsl:template match ="some_test_value/text()[.&lt; 500]">500 </xsl:template>
   <xsl:template match ="some_test_value/text()[.&gt; 2000]">2000 </xsl:template>

</xsl:stylesheet> 

要转换的 XML 数据示例

<class guid="a58bca48-cb0a-5f37-3a11-916e3a74959">
    <cork_id value="871222" valid="false"/>
    <merk_id value="11111" valid="false"/>
    <todd_id value="2188" valid="true"/>
    <name> Garp Toblabber </name>
    <classification>Sarcastic</classification>
    <is_gone>true</is_gone>
    <move>true
        <thingA>true</thingA>
        <thingB>true
            <subThingB>true </subThingB>
        </thingB>
    </move>
    <class_show_text> DA </class_show_text>
    <some_test_value> 3000 </some_test_value>
    <some_test_value> 3 </some_test_value>
    <some_test_value> 520 </some_test_value>
    <ew_tv_text> Drag </ew_tv_text>
    <standard_room_type> liquid </standard_room_type>    
    <viral_desc> Dull </viral_desc>
    <out_id euro_std="A" id="55" name="Nerf" environment="Volatile" category="Vague" modifier="Yes" is_out="false"/>
    <source/>
    <comments/>
</class>

所需的输出如下所示

<r>
<add> 1 </add>
<del> 1 </del>
<mod> 2 </mod>
</r>

【问题讨论】:

  • 你的例子有多大的代表性?根据您向我们展示的内容,所有受影响的节点都是根元素的直接子节点,计算它们是微不足道的。 --- 附:您将使用哪个处理器?
  • @michael.hor257k 该示例是较大 xml 的子集。 xslt 转换的添加、删除和修改也是一个小子集。所以每种类型都会有很多。我将使用 .NET 处理器。
  • 它是针对每个处理的文件还是一个通用的偶尔报告?如果您正在寻找模板报告工具,则有许多内置编辑器,例如 oXygen。
  • 转换用于处理 xml 文件,这些文件基本上是针对不同客户集的配置文件。这是经常使用的东西。

标签: xml xslt


【解决方案1】:

以下样式表:

XSLT 1.0

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

<xsl:template match="/class">
    <r>
        <add><xsl:value-of select="count(viral_desc)"/></add>
        <del><xsl:value-of select="count(is_gone)"/></del>
        <mod><xsl:value-of select="count(some_test_value[. &lt; 500 or . > 2000])"/></mod>
    </r>
</xsl:template>

</xsl:stylesheet>

当应用于您的输入示例时,将返回:

<?xml version="1.0" encoding="utf-8"?>
<r>
   <add>1</add>
   <del>1</del>
   <mod>2</mod>
</r>

要使其更通用并计算任何级别的指定节点,请简单地使用:

<xsl:template match="/">
    <r>
        <add><xsl:value-of select="count(//viral_desc)"/></add>
        <del><xsl:value-of select="count(//is_gone)"/></del>
        <mod><xsl:value-of select="count(//some_test_value[. &lt; 500 or . > 2000])"/></mod>
    </r>
</xsl:template>

【讨论】:

  • 感谢您的回答。有没有办法计算每个节点的多个节点?像 count(//viral_desc)+count(//other_addition) 这样的东西来获得必要的输出?
  • 当然:count (//x) + count (//y)count (//x | //y) 应该可以工作。
  • P.S.我不确定您的出发点是什么。您可能需要考虑保留一个基本 XMl 文档,列出每个类别中的节点,并使用 XSLT 从该文档生成两个样式表。
  • 我刚刚阅读了有关 XMI 的内容,但我不确定我是否有足够的把握来理解您的陈述。我将要转换的 XML 由不使用 XMI 或模式的工具输出。虽然,它应该符合模式。我的工具修改和生成的 XML 也保持 XML(没有 HTML 或其他网络技术)。 XSLT 最终将通过对两个相似但不同的 xslt 进行 xml 差异来生成。
猜你喜欢
  • 2010-11-06
  • 2016-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-20
  • 1970-01-01
  • 1970-01-01
  • 2015-11-28
相关资源
最近更新 更多