2013-12-06 5 views
-1

Я пишу XML и XSL для создания HTML-документа на основе книги. Все файлы называются chapter-1.xml, глава-2.xml и т. Д. И название в каждой главе начинается с главы #, за которой следует заголовок главы. Главы будут написаны разными людьми, поэтому каждая глава должна быть в каждом xml-файле.Как найти номер раздела за пределами XML

XML:

<chapter title="This is the first chapter"> 
<paragraph title="Start">Blablabla</paragraph> 
</chapter> 

XSL:

<xsl:for-each select="chapter"> 
    <h1><xsl:value-of select="current()/@title"/></h1> 
    <xsl:for-each select="chapter"> 
     <h2><xsl:value-of select="current()/@title"/></h2><br><br> 
     <xsl:value-of select="current()" /> 
    </xsl:for-each> 
</xsl:for-each> 

У меня есть PHP для создания HTML:

<?php 
# LOAD XML FILE 
$XML = new DOMDocument(); 
$XML->load('chapter-1.xml'); 

$xslt = new XSLTProcessor(); 
$XSL = new DOMDocument(); 
$XSL->load('chapter.xsl'); 
$xslt->importStylesheet($XSL); 
print $xslt->transformToXML($XML); 
?> 

И я хочу, чтобы это показать, как «1. Это первая глава "в HTML. Есть ли способ разрешить это без использования другого атрибута в теге? В каждом документе есть только один тег раздела. Есть ли способ решить это с помощью CSS или получить номер главы из имени файла или так?

Мне также необходимо создать таблицу содержимого для всех разделов с нумерацией.

+0

Этот вопрос непонятен. Покажите фрагмент вашей (если не всей) таблицы стилей и ожидаемый результат. Вы сами контролируете структуру своих входных файлов? –

+0

Лучше сейчас? У меня пока нет CSS. – janlindso

+0

Лучше, но все же: Как вы относитесь к проблеме, которую вы опубликовали? Я не уверен, что вы действительно пытались решить это самостоятельно. Кроме того, покажите больше таблицы стилей (если вы можете использовать для каждого, как это, как вы собрали все элементы главы, находясь в отдельных файлах каждый, как вы утверждаете?). –

ответ

0

Предположим, у вас есть документ под названием «toc.xml», расположенный в том же каталоге, что и таблицы стилей, который выглядит следующим образом:

<?xml version="1.0" encoding="utf-8" ?> 
<toc> 
<chapter num="1" title="First Chapter"/> 
<chapter num="2" title="Second Chapter"/> 
<chapter num="3" title="Inserted Chapter"/> 
<chapter num="4" title="Third Chapter"/> 
<chapter num="5" title="Last Chapter"/> 
<chapter num="6" title="Last Minute Chapter"/> 
</toc> 

И пусть ваш «глава-3.xml» документ выглядит как это:

<?xml version="1.0" encoding="utf-8" ?> 
<chapter title="Third Chapter"> 
    <paragraph title="Start">Lorem ipsum ... </paragraph> 
    <paragraph title="End">...nota bene.</paragraph> 
</chapter> 

Теперь, применяя следующую таблицу стилей 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="html" encoding="utf-8"/> 

<xsl:variable name="toc" select="document('toc.xml')/toc" /> 

<xsl:template match="/"> 
<html> 
<body> 

<xsl:variable name="chapTitle" select="chapter/@title" /> 
<xsl:variable name="chapNum" select="$toc/chapter[@title=$chapTitle]/@num"/> 

<h1><xsl:value-of select="concat($chapNum, '. ', $chapTitle)"/></h1> 

<xsl:for-each select="chapter/paragraph"> 
    <h2><xsl:value-of select="@title"/></h2> 
    <p><xsl:value-of select="."/></p> 
</xsl:for-each> 
<h4><xsl:value-of select="concat('Next chapter: ', $toc/chapter[$chapNum+1]/@title)"/></h4> 

</body> 
</html> 
</xsl:template> 
</xsl:stylesheet> 

будет р получить этот результат:

<html> 
    <body> 
     <h1>4. Third Chapter</h1> 
     <h2>Start</h2> 
     <p>Lorem ipsum ... </p> 
     <h2>End</h2> 
     <p>...nota bene.</p> 
     <h4>Next chapter: Last Chapter</h4> 
    </body> 
</html> 
+0

Выглядит хорошо! Я попробую его и переключу свой ответ, если он сработает! Большое спасибо! – janlindso

+0

@janlindso сделайте пожалуйста. –

+0

Похоже на то, что я мог бы подойти ближе. Благодаря! – janlindso

0

Поскольку ваш код не имеет никакого смысла, я боюсь, это общая идея, как обратиться к такой проблеме, как ваша.

Управление ваш вклад

Это неудобно иметь отдельные файлы XML для chapter узлов. Поэтому, если вы сами создаете эти файлы, обязательно создайте все элементы chapter в том же файле XML, например. например:

<chapters> 
<chapter title="This is the first chapter"> 
    <paragraph title="Start">Blablabla</paragraph> 
</chapter> 
<chapter title="xy"> 
    <paragraph title="Start">Blablabla</paragraph> 
</chapter> 
</chapters> 

Самый умный способ сделать это - ввести атрибут нумерации на этом этапе уже. Если вы не можете изменить структуры ввода, используйте функцию X12T document(), чтобы включить в преобразование несколько XML-файлов.

Использование xsl:for-each и position() для создания нумерации

Если вам удается сгруппировать элементы вместе в одном файле, номер их с атрибутом. Например,

<xsl:variable name="chaps" select="//chapter"/> 

<xsl:template match="chapters"> 
    <xsl:for-each select="$chaps"> 
     <xsl:copy> 
     <xsl:attribute name="nr"> 
      <xsl:value-of select="position()"/> 
     </xsl:attribute> 
     </xsl:copy> 
    </xsl:for-each> 
</xsl:template> 

В качестве альтернативы, вы можете также использовать xsl:number для этого.

Q &

Есть в любом случае, чтобы решить эту проблему без использования другого атрибута в теге ?

Да, произведите нумерацию непосредственно на выходе HTML одним из двух методов.

Есть ли способ решить это с помощью CSS или получить номер главы из имени файла или так?

Попытка решить эту проблему в CSS - это плохая идея. CSS - это стиль оформления документа, а не изменение содержимого. Я бы также посоветовал не полагаться на имена файлов при преобразовании документов.

+0

Большое спасибо за ваш ответ (ы). К сожалению, главы будут собраны разными людьми, поэтому необходимо найти подход с разными именами файлов. Последнее упомянутое решение от пользователя @ user3016153 близко к тому, чего я пытаюсь достичь. – janlindso

+1

@janlindso, если этот метод не сработал для вас, вам следует рассмотреть вопрос об обновлении вашего вопроса, чтобы включить дополнительную релевантную информацию, чтобы, надеюсь, следующий ответ, который кто-то создает, будет соответствовать всем вашим ограничениям. –

+0

@jalindso Я могу только повторить: если вы зададите широкий вопрос, открытый для оспаривания, вы можете ожидать только широкие и общие ответы. Помните об этом для будущих сообщений. –

Смежные вопросы