所以我想用“wd = 1”作为属性计算节点的数量,我想做一些事情,比如说,第4次出现第9次和第15次“wd = 1”。我怎么能这样做?
我知道如何计算某件事的总发生次数,而且我知道如果我想在每次事件中做一些事情,我可以使用'for each',但我不知道如何做到这一点。
这是我正在使用的原始XML的片段
<?xml version="1.0" encoding="UTF-16"?>
<?xml-stylesheet href="XSLT Stylesheet.XSL" type="text/xsl"?>
<!--XML document generated using OCR technology from Nuance Communications, Inc.-->
<document xmlns="http://www.scansoft.com/omnipage/xml/ssdoc-schema3.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<page ocr-vers="OmniPageCSDK18" app-vers="OmniPage 19">
<description>
<source file="C:\Users\danielsteele\Pictures\7740411202.jpg" dpix="300" dpiy="300" sizex="3375" sizey="2330"/>
<theoreticalPage size="Custom" marginLeft="134" marginTop="40" marginRight="45" marginBottom="1184" offsetY="-84" width="16200" height="11184"/>
<language>en</language>
</description>
<body>
<section l="14275" t="40" r="15715" b="228">
<column l="14275" t="40" r="15715" b="228">
<para l="14308" t="84" r="15697" b="197" alignment="left" spaceBefore="2" lsp="exactly" lspExact="174" language="en">
<tabs position="14308"/>
<ln l="14669" t="84" r="15631" b="197" baseLine="182">
<run underlined="none" subsuperscript="none" fontSize="800" fontFace="Times New Roman" fontFamily="roman" fontPitch="variable" spacing="0" foreColor="0c0c0c"><wd l="0" t="0" r="0" b="0">Page</wd>
<tab position="14669"/>
</run>
<run underlined="none" subsuperscript="none" fontSize="800" fontFace="Times New Roman" fontFamily="roman" fontPitch="variable" spacing="0" foreColor="0c0c0c"><wd l="15185" t="89" r="15218" b="194">1</wd>
<space/>
<wd l="15326" t="84" r="15470" b="197">of</wd>
<space/>
<wd l="15595" t="89" r="15631" b="194">1</wd>
</run>
</ln>
</para>
</column>
</section>
<dd l="139" t="266" r="8777" b="3762">
<dd l="4297" t="266" r="8777" b="1807" backColor="d3d3d2" bottomDistance="375">
<bottomBorder type="single" width="2" color="d7d7d7"/>
<dd l="4297" t="266" r="8777" b="1807">
<table l="4297" t="266" r="8777" b="1803" alignment="left">
<gridTable>
<gridCol>3899</gridCol>
<gridCol>581</gridCol>
<gridRow>1537</gridRow>
</gridTable>
<cell gridColFrom="0" gridColTill="0" gridRowFrom="0" gridRowTill="0" alignment="left" verticalAlignment="top">
<para l="4373" t="367" r="6322" b="679" alignment="left" li="72" spaceBefore="53" lsp="exactly" lspExact="197" language="en">
<ln l="4373" t="367" r="6322" b="482" baseLine="480" underlined="none" subsuperscript="none" fontSize="800" fontFace="Times New Roman" fontFamily="roman" fontPitch="variable" spacing="0" foreColor="0c0c0c" forcedEOF="true">
<wd l="4373" t="367" r="4572" b="480">HP</wd>
<space/>
<wd l="4618" t="367" r="4944" b="480">VAT</wd>
<space/>
<wd l="4985" t="370" r="5213" b="482">No:</wd>
<space/>
<wd l="5388" t="367" r="6322" b="480">GB314149679
</wd>
</ln>
<ln l="4373" t="562" r="5738" b="679" baseLine="677" underlined="none" subsuperscript="none" fontSize="800" fontFace="Times New Roman" fontFamily="roman" fontPitch="variable" spacing="0" foreColor="0c0c0c" forcedEOF="true">
<wd l="4373" t="562" r="5446" b="679">Hewlett-Packard</wd>
<space/>
<wd l="5491" t="562" r="5738" b="677">Ltd.</wd>
</ln>
</para>
答案 0 :(得分:1)
“第9次和第15次出现”不是“每个第n次”。要在每第n次出现时执行“某事”,您可以测试position() mod n
。例如:
<xsl:if test="not (position() mod 3)">"
<xsl:attribute name="something">
<xsl:value-of select="'yes'"/>
</xsl:attribute>
</xsl:if>
将向正在处理的元素的每个第三个元素添加一个属性。
要选择不遵循可定义模式的特定事件,您需要构建一个列表并检查当前位置是否显示在其中。
<强> ADDED 强>
我将如何构建所述列表并对其进行检查?
要构建列表,您可以定义一个变量,例如:
<xsl:variable name="positions" select="'-4-9-15-'" />
然后按以下方式检查列表:
<xsl:if test="contains($positions, concat('-', position(), '-'))">
<xsl:attribute name="something">
<xsl:value-of select="'yes'"/>
</xsl:attribute>
</xsl:if>
请注意,这是一个相当原始的例子。一个更灵活的方法是将选定的位置保留在外部XML文档中(或者甚至在样式表本身内)作为一组节点 - 然后使用简单的position() = set
设置样式表比较。
已添加#2
以下是您可以使用w3schools Tryit Editor尝试的两个示例。第一个标记所选位置的记录:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:variable name="positions" select="'-4-9-15-'" />
<xsl:template match="/">
<html>
<body>
<h2>My CD Collection</h2>
<table border="1">
<tr bgcolor="#9acd32">
<th>Title</th>
<th>Artist</th>
<th>Position</th>
<th>Mark</th>
</tr>
<xsl:for-each select="catalog/cd">
<tr>
<td><xsl:value-of select="title" /></td>
<td><xsl:value-of select="artist" /></td>
<td><xsl:value-of select="position()" /></td>
<td><xsl:value-of select="contains($positions, concat('-', position(), '-'))" /></td>
</tr>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
这一个,OTOH,仅选择指示位置的记录:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:variable name="positions" select="'-4-9-15-'" />
<xsl:template match="/">
<html>
<body>
<h2>My CD Collection</h2>
<table border="1">
<tr bgcolor="#9acd32">
<th>Title</th>
<th>Artist</th>
</tr>
<xsl:for-each select="catalog/cd[contains($positions, concat('-', position(), '-'))]">
<tr>
<td><xsl:value-of select="title" /></td>
<td><xsl:value-of select="artist" /></td>
</tr>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
答案 1 :(得分:1)
如果您正在使用XSLT 2并且您有一组任意编号的元素出现,您可以使用序列轻松匹配它们。为了这个例子,我使这更加冗长而不是真正需要。我假设一个元素foo
,其属性为bar
:
<xsl:variable name="all-foos-with-bar" select="//foo[@bar]"/>
<xsl:variable name="interesting-indices" select="(4, 9, 15)"/>
<xsl:apply-templates select="$all-foos-with-bar[position() = $interesting-indices]"/>
xsl:apply-templates
语句使用XPath 2.0的一般比较运算符,它允许您比较序列(请记住,一个值被认为与包含一个项目的序列相同)。当比较序列与一般运算符相等时,发生的比较是“LH序列中的任何值都等于RH序列中的任何值”。