Xslt 跨同级元素的子级分组

Xslt 跨同级元素的子级分组,xslt,idml,Xslt,Idml,我正在使用XSLT处理IDML文件。在InDesign导出的IDML中,它一起运行相同样式的consequentive段落,由标记分隔,如下所示(我的输入XML): 正如所料,当跨越输入中的多个CharacterStyleRange元素时,我的分组方法不起作用。但是,有没有一种分组方法可以做到这一点?或者我最好采取另一种方法,比如每次Br终止CharacterStyleRange和ParagraphStyleRange,然后作为中间步骤重新打开它们以简化处理过程?因此,您的方法几乎可以实现。将分

我正在使用XSLT处理IDML文件。在InDesign导出的IDML中,它一起运行相同样式的consequentive段落,由

标记分隔,如下所示(我的输入XML):


正如所料,当跨越输入中的多个
CharacterStyleRange
元素时,我的分组方法不起作用。但是,有没有一种分组方法可以做到这一点?或者我最好采取另一种方法,比如每次
Br
终止
CharacterStyleRange
ParagraphStyleRange
,然后作为中间步骤重新打开它们以简化处理过程?

因此,您的方法几乎可以实现。将分组向上移动一级,并在模板匹配段落样式范围中执行此操作:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs" version="2.0">

<xsl:output indent="yes"/>

<xsl:template match="Story">
    <story>
        <xsl:apply-templates select="ParagraphStyleRange"/>
    </story>
</xsl:template>

<xsl:template match="ParagraphStyleRange">
    <xsl:variable name="para_style_name" select="replace(@AppliedParagraphStyle, 'ParagraphStyle/', '')"/>
    <xsl:for-each-group select="CharacterStyleRange/*" group-ending-with="Br">
        <xs:element name="{para_style_name}">
            <xsl:apply-templates select="current-group()[self::Content]"/>
        </xs:element>
    </xsl:for-each-group>
</xsl:template>

<xsl:template match="Content">
    <xsl:variable name="char_style_name" select="replace(../@AppliedCharacterStyle, 'CharacterStyle/', '')"/>
    <xsl:choose>
        <xsl:when test="$char_style_name = '$ID/[No character style]'">
            <xsl:value-of select="."/>
        </xsl:when>
        <xsl:otherwise>
            <xsl:element name="{$char_style_name}">
                <xsl:value-of select="."/>
            </xsl:element>
        </xsl:otherwise>
    </xsl:choose>
</xsl:template>

</xsl:stylesheet>

<?xml version="1.0" encoding="UTF-8"?>
<story> 
    <para>All rights reserved. No part of this publication may be reproduced in any material form (including photocopying or storing it in any medium by electronic means and whether or not transiently or incidentally to some other use of this publication) without the written permission of the copyright owner except in accordance with the provisions of the Copyright, Designs and Patents Act 1988 or under the terms of a licence issued by the <italic>Copyright Licensing Agency Ltd, Saffron House, 6-10 Kirby Street, London, EC1N 8TS England</italic>. Applications for the copyright owner’s written permission to reproduce any part of this publication should be addressed to the publisher.</para>
    <para>Warning: The doing of an unauthorised act in relation to a copyright work may result in both a civil claim for damages and criminal prosecution.</para>
    <para>Crown copyright material is reproduced with the permission of the Controller of HMSO and the Queen’s Printer for Scotland.</para>
</story>
<?xml version="1.0" ?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    <xsl:template match="/Story">
        <story>
            <xsl:apply-templates/>
        </story>
    </xsl:template>

    <xsl:template match="ParagraphStyleRange">
        <xsl:apply-templates>
            <xsl:with-param name="para_style_name" select="replace(./@AppliedParagraphStyle, 'ParagraphStyle/', '')"/>
        </xsl:apply-templates>
    </xsl:template>

    <xsl:template match="CharacterStyleRange">
        <xsl:param name="para_style_name"/>
        <xsl:variable name="char_style_name" select="replace(./@AppliedCharacterStyle, 'CharacterStyle/', '')"/>
        <xsl:for-each-group select="*" group-ending-with="Br">
            <xsl:element name="{$para_style_name}">
                <xsl:choose>
                    <xsl:when test="$char_style_name = '$ID/[No character style]'">
                        <xsl:apply-templates select="current-group()"/>
                    </xsl:when>
                    <xsl:otherwise>
                        <xsl:element name="{$char_style_name}">
                            <xsl:apply-templates select="current-group()"/>
                        </xsl:element>
                    </xsl:otherwise>
                </xsl:choose>
            </xsl:element>
        </xsl:for-each-group>
    </xsl:template>

    <xsl:template match="Content">
        <xsl:value-of select="."/>
    </xsl:template>

    <xsl:template match="Br"/>

</xsl:stylesheet>
<?xml version="1.0" encoding="UTF-8"?>
<story> 
    <para>All rights reserved. No part of this publication may be reproduced in any material form (including photocopying or storing it in any medium by electronic means and whether or not transiently or incidentally to some other use of this publication) without the written permission of the copyright owner except in accordance with the provisions of the Copyright, Designs and Patents Act 1988 or under the terms of a licence issued by the </para>
    <para><italic>Copyright Licensing Agency Ltd, Saffron House, 6-10 Kirby Street, London, EC1N 8TS England</italic></para>
    <para>. Applications for the copyright owner’s written permission to reproduce any part of this publication should be addressed to the publisher.</para>
    <para>Warning: The doing of an unauthorised act in relation to a copyright work may result in both a civil claim for damages and criminal prosecution.</para>
    <para>Crown copyright material is reproduced with the permission of the Controller of HMSO and the Queen’s Printer for Scotland.</para>
</story>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs" version="2.0">

<xsl:output indent="yes"/>

<xsl:template match="Story">
    <story>
        <xsl:apply-templates select="ParagraphStyleRange"/>
    </story>
</xsl:template>

<xsl:template match="ParagraphStyleRange">
    <xsl:variable name="para_style_name" select="replace(@AppliedParagraphStyle, 'ParagraphStyle/', '')"/>
    <xsl:for-each-group select="CharacterStyleRange/*" group-ending-with="Br">
        <xs:element name="{para_style_name}">
            <xsl:apply-templates select="current-group()[self::Content]"/>
        </xs:element>
    </xsl:for-each-group>
</xsl:template>

<xsl:template match="Content">
    <xsl:variable name="char_style_name" select="replace(../@AppliedCharacterStyle, 'CharacterStyle/', '')"/>
    <xsl:choose>
        <xsl:when test="$char_style_name = '$ID/[No character style]'">
            <xsl:value-of select="."/>
        </xsl:when>
        <xsl:otherwise>
            <xsl:element name="{$char_style_name}">
                <xsl:value-of select="."/>
            </xsl:element>
        </xsl:otherwise>
    </xsl:choose>
</xsl:template>

</xsl:stylesheet>