出于政治原因,客户希望我实现一种方法来计算以通用方式在xml文档上完成的xslt转换的数量,而不是以另一种方式执行。我知道变量一旦根据一些论坛进行初始化就无法改变,但如果我理解正确,就会有一个使用模板的工作。虽然,我很难绕过它。
将有3种不同类型的计数器:添加,修改和删除。我想将计数输出到某种文件。我猜测一种方法是使用基于第一个的第二个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()[.< 500]">500 </xsl:template>
<xsl:template match ="some_test_value/text()[.> 2000]">2000 </xsl:template>
</xsl:stylesheet>
<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>
答案 0 :(得分: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[. < 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[. < 500 or . > 2000])"/></mod>
</r>
</xsl:template>