0

問題: XHTML リストを処理して XML 出力を生成するスクリプトを生成できました。

問題は、順序付きリストがある場合、XSLT はどのように見えるべきかということでした。

ありがとう@Sbof

次の XML を生成する必要があります。

<ParagraphStyleRange AppliedParagraphStyle="ParagraphStyle/ul">
  <CharacterStyleRange AppliedCharacterStyle="CharacterStyle/Character Style 1">
    <Content>abc</Content>
    <Br/>
    <Content>xyz</Content>
    <Br/>
    <Content>abc</Content>
    <Br/>
    <Content>xyzabc</Content>
    <Br/>
  </CharacterStyleRange>
</ParagraphStyleRange>
<ParagraphStyleRange AppliedParagraphStyle="ParagraphStyle/ol level 1">
  <CharacterStyleRange AppliedCharacterStyle="CharacterStyle/Character Style 1">
    <Content>xyz</Content>
    <Br/>
  </CharacterStyleRange>
</ParagraphStyleRange>
<ParagraphStyleRange AppliedParagraphStyle="ParagraphStyle/ol level 2">
  <CharacterStyleRange AppliedCharacterStyle="CharacterStyle/Character Style 1">
    <Content>abc</Content>
    <Br/>
  </CharacterStyleRange>
</ParagraphStyleRange>

次のような XHTML (内容は異なりますが、同じことを行います) があります。

<?xml version="1.0" encoding="utf-8" ?>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title></title>
</head>
<body>
<ol>
    <li>abc</li>
    <li>xyz</li>
    <li>abc</li>
    <li>xyzabc</li>
    <li>xyz<ol>
        <li>abc</li>
        </ol>
    </li>
    <li>xyzxyz</li>
    <li>abc</li>
    <ol>
        <li>xyz</li>
    </ol>
    <li>next level</li>
</ol>
</body>
</html>

これは、XHTML を横切る XSLT のスニペットです。

  <xsl:template match="xhtml:ol/xhtml:li[not(*)]">
    <xsl:call-template name="para-style-range">
      <xsl:with-param name="style-name">article%3aol Level 1</xsl:with-param>
    </xsl:call-template>
    <xsl:if test ="xhtml:ol/xhtml:li[*]|
                   xhtml:ul/xhtml:li[*]">
      <xsl:apply-templates select="xhtml:ol/xhtml:li[*]|
                                   xhtml:ul/xhtml:li[*]" />
    </xsl:if>
  </xsl:template>

これは、スクリプトを使用して得た結果です。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<idPkg:Story xmlns:idPkg="http://ns.adobe.com/AdobeInDesign/idml/1.0/packaging" DOMVersion="7.5">
    <Story Self="ucb" AppliedTOCStyle="n" TrackChanges="false" StoryTitle="$ID/" AppliedNamedGrid="n">
        <StoryPreference OpticalMarginAlignment="false" OpticalMarginSize="12" FrameType="TextFrameType" StoryOrientation="Horizontal" StoryDirection="LeftToRightDirection"/>
        <InCopyExportOption IncludeGraphicProxies="true" IncludeAllResources="false"/>
        <ParagraphStyleRange AppliedParagraphStyle="ParagraphStyle/ul">
            <CharacterStyleRange AppliedCharacterStyle="CharacterStyle/Character Style 1">
                <Content>abc</Content>
                <Br/>
                <Content>xyz</Content>
                <Br/>
                <Content>abc</Content>
                <Br/>
                <Content>xyzabc</Content>
                <Br/>
            </CharacterStyleRange>
        </ParagraphStyleRange>
        <ParagraphStyleRange AppliedParagraphStyle="ParagraphStyle/ol level 1">
            <CharacterStyleRange AppliedCharacterStyle="CharacterStyle/Character Style 1">
                <Content>xyz</Content>
                <Br/>
            </CharacterStyleRange>
        </ParagraphStyleRange>
        <ParagraphStyleRange AppliedParagraphStyle="ParagraphStyle/ol level 2">
            <CharacterStyleRange AppliedCharacterStyle="CharacterStyle/Character Style 1">
                <Content>abc</Content>
                <Br/>
            </CharacterStyleRange>
        </ParagraphStyleRange>
        <ParagraphStyleRange AppliedParagraphStyle="ParagraphStyle/ol level 1">
            <CharacterStyleRange AppliedCharacterStyle="CharacterStyle/Character Style 1">
                <Content>xyzxyz</Content>
                <Br/>
                <Content>abc</Content>
                <Br/>
            </CharacterStyleRange>
        </ParagraphStyleRange>
        <ParagraphStyleRange AppliedParagraphStyle="ParagraphStyle/ol level 3">
            <CharacterStyleRange AppliedCharacterStyle="CharacterStyle/Character Style 1">
                <Content>xyz</Content>
                <Br/>
            </CharacterStyleRange>
        </ParagraphStyleRange>
        <ParagraphStyleRange AppliedParagraphStyle="ParagraphStyle/ol level 1">
            <CharacterStyleRange AppliedCharacterStyle="CharacterStyle/Character Style 1">
                <Content>next level</Content>
                <Br/>
            </CharacterStyleRange>
        </ParagraphStyleRange>
    </Story>
</idPkg:Story>

段落の属性値を取得するために切り取られた XSLT:

<xsl:template name="para-style-range">
    <!-- The name of the paragraph style in InDesign -->
    <xsl:param name="style-name"/>
    <xsl:param name ="isTable" />
    <!-- A string of text that will precede the paragraph's actual content (ex: 'by ')-->
    <xsl:param name="prefix-content" select="''"/>
    <ParagraphStyleRange>
      <xsl:attribute name="AppliedParagraphStyle">
        <xsl:value-of select="concat('ParagraphStyle/', $style-name)"/>
      </xsl:attribute>
      <xsl:if test="$prefix-content != ''">
        <CharacterStyleRange>
          <Content><xsl:value-of select="$prefix-content"/></Content>
        </CharacterStyleRange>
      </xsl:if>
      <xsl:apply-templates select="text()|*" mode="character-style-range"/>
      <xsl:choose>
        <xsl:when test ="$isTable = 'true'">
          <!--Dont do any thing here-->
        </xsl:when>
        <xsl:otherwise>
          <Br/>
        </xsl:otherwise>
      </xsl:choose>

    </ParagraphStyleRange>
  </xsl:template>

コードについてまだ混乱している人や、理解するのに助けが必要な人を助けるために、さらにスクリプトを提供できるかどうか教えてください.

4

1 に答える 1

0

次のXSLはあなたの例で機能します:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
    xmlns:html="http://www.w3.org/1999/xhtml"
    exclude-result-prefixes="html">
    <xsl:template match="text()"/>
    <xsl:template match="/">
        <rootElement>
            <xsl:apply-templates/>
        </rootElement>
    </xsl:template>
    <xsl:template match="//html:ol">
        <ParagraphStyleRange>
            <xsl:attribute name="AppliedParagraphStyle">
                <xsl:text>ParagraphStyle/ol level </xsl:text>
                <xsl:value-of select="count(ancestor::html:ol)"/>
            </xsl:attribute>
            <xsl:apply-templates select="child::html:li"/>
        </ParagraphStyleRange>
        <xsl:apply-templates select="descendant::html:ol"/>
    </xsl:template>

    <xsl:template match="//html:li">
        <CharacterStyleRange>
            <xsl:attribute name="AppliedCharacterStyle">
                <xsl:text>CharacterStyle/Character Style </xsl:text>
                <xsl:value-of select="count(ancestor::html:li)"/>
            </xsl:attribute>
        <Content>
            <xsl:value-of select="normalize-space(text())"/>
        </Content>
        <br/>
        </CharacterStyleRange>
    </xsl:template>
</xsl:stylesheet>

私が使用した正確な入力は

<!DOCTYPE html SYSTEM "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <title></title>
    </head>
    <body>
        <ol>
            <li>level1a</li>
            <li>level1b
                <ol>
                    <li>level2a</li>
                    <li>level2b</li>
                    <li>level2c
                        <ol>
                            <li>level3a</li>
                        </ol>
                    </li>
                </ol>
            </li>
        </ol>
    </body>
</html>

これを正確なニーズに適合させる必要があるかもしれません。

于 2012-09-28T10:52:11.110 に答える