考虑到相同的属性值,需要删除第一个标题
Need to remove the first title considering the same attribute value
考虑到两个标题的输出类值相同,我需要从 body 元素中删除第一个标题
输入XML:
<topic>
<title outputclass="header">Sample</title>
<topic>
<title outputclass="header">Test</title>
<topic>
<title outputclass="section">Section</title>
<body>
<p outputclass="normal">Solution</p>
</body>
</topic>
</topic>
</topic>
XSLT 我有:
<xsl:template match="/*">
<document>
<head>
<title><xsl:value-of select="title[@outputclass='header']"/></title>
</head>
<body>
<xsl:apply-templates/>
</body>
</document>
</xsl:template>
<xsl:template match="topic/title[@outputclass='header'][1]"/>
<xsl:template match="topic">
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="body">
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="title | p">
<p>
<xsl:apply-templates/>
</p>
</xsl:template>
预期输出:
<document>
<head><title>Sample</title></head>
<body>
<p>Test</p>
<p>Section</p>
<p>Solution</p>
</body>
</document>
我只需要删除考虑相同属性的第一个标题 outputclass
。
您可以声明一个 top-level 变量或参数
<xsl:param name="first-output-header" select="/*/descendant::title[@outputclass = 'header'][1]"/>
然后使用
<xsl:template match="$first-output-header"/>
至少在 XSLT 3 中是这样。我认为在 XSLT 2 中也是可能的,但需要深入研究规范或找到实现该“旧”版本的东西。
XSLT 3 中的另一个选项是使用累加器来计算“header”并检查值,例如
<xsl:accumulator name="header-count" as="xs:integer" initial-value="0">
<xsl:accumulator-rule
match="topic/title[@outputclass = 'header']"
select="$value + 1"/>
</xsl:accumulator>
<xsl:mode use-accumulators="header-count"/>
<xsl:template match="topic/title[@outputclass = 'header'][accumulator-before('header-count') = 1]"/>
这也适用于流媒体。
考虑到两个标题的输出类值相同,我需要从 body 元素中删除第一个标题
输入XML:
<topic>
<title outputclass="header">Sample</title>
<topic>
<title outputclass="header">Test</title>
<topic>
<title outputclass="section">Section</title>
<body>
<p outputclass="normal">Solution</p>
</body>
</topic>
</topic>
</topic>
XSLT 我有:
<xsl:template match="/*">
<document>
<head>
<title><xsl:value-of select="title[@outputclass='header']"/></title>
</head>
<body>
<xsl:apply-templates/>
</body>
</document>
</xsl:template>
<xsl:template match="topic/title[@outputclass='header'][1]"/>
<xsl:template match="topic">
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="body">
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="title | p">
<p>
<xsl:apply-templates/>
</p>
</xsl:template>
预期输出:
<document>
<head><title>Sample</title></head>
<body>
<p>Test</p>
<p>Section</p>
<p>Solution</p>
</body>
</document>
我只需要删除考虑相同属性的第一个标题 outputclass
。
您可以声明一个 top-level 变量或参数
<xsl:param name="first-output-header" select="/*/descendant::title[@outputclass = 'header'][1]"/>
然后使用
<xsl:template match="$first-output-header"/>
至少在 XSLT 3 中是这样。我认为在 XSLT 2 中也是可能的,但需要深入研究规范或找到实现该“旧”版本的东西。
XSLT 3 中的另一个选项是使用累加器来计算“header”并检查值,例如
<xsl:accumulator name="header-count" as="xs:integer" initial-value="0">
<xsl:accumulator-rule
match="topic/title[@outputclass = 'header']"
select="$value + 1"/>
</xsl:accumulator>
<xsl:mode use-accumulators="header-count"/>
<xsl:template match="topic/title[@outputclass = 'header'][accumulator-before('header-count') = 1]"/>
这也适用于流媒体。