Помощь по преобразованию XML в позиционный текстовый файл без пробелов - PullRequest
1 голос
/ 21 июля 2011

Я пытаюсь создать позиционный файл из XML.Я создал XSLT и работаю нормально, если поле не заполнено пробелами.В этом случае XSL возвращает только один пробел.Я использую MSXML (6.0).

Я безуспешно попробовал следующее:

<xsl:strip-space elements="*"/>
<xsl:preserve-space elements="*"/>

<fo:block white-space-collapse="false" white-space-treatment="preserve" >
    <!-- Code here -->
</fo:block>

Вот ввод XML, XSLT и вывод.

<Document>
      <Header>
        <Title>Long life to the queen   </Title>
        <Author>Sam Catnip     </Author>
        <Year>1996</Year>
        <Edition>  1</Edition>
        <Price>          12.99</Price>
        <Pages>    1244</Pages>
        <AuthorNotes>                    </AuthorNotes>
        <Abstract>It is a great book  </Abstract>
    </Header>
      <Header>
        <Title>Life and live longer     </Title>
        <Author>Bill Griffin   </Author>
        <Year>2001</Year>
        <Edition>  1</Edition>
        <Price>           2.99</Price>
        <Pages>      44</Pages>
        <AuthorNotes>Yeah, right         </AuthorNotes>
        <Abstract>Wishfull thinking    </Abstract>
    </Header>
</Document>

XSLT:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:fn="http://www.w3.org/2005/xpath-functions">
    <xsl:output method="text"/>
    <xsl:template match="//Document">
        <xsl:for-each select="./Header">
            <xsl:value-of select="./Title"/>
            <xsl:value-of select="./Author"/>
            <xsl:value-of select="./Year"/>
            <xsl:value-of select="./Edition"/>
            <xsl:value-of select="./Price"/>        
            <xsl:value-of select="./Pages"/>
            <xsl:value-of select="./AuthorNotes"/>
            <xsl:value-of select="./Abstract"/>
            <xsl:text>&#13;&#10;</xsl:text>
        </xsl:for-each>
    </xsl:template>
</xsl:stylesheet>

Вывод:

Long life to the queen   Sam Catnip     1996  1          12.99    1244It is a great book  
Life and live longer     Bill Griffin   2001  1           2.99      44Yeah, right         Wishfull thinking    

Когда это должно быть:

Long life to the queen   Sam Catnip     1996  1          12.99    1244                    It is a great book  
Life and live longer     Bill Griffin   2001  1           2.99      44Yeah, right         Wishfull thinking    

Я буду очень признателен за любую идею о том, как решитьэто.

Спасибо,

Арти

1 Ответ

2 голосов
/ 21 июля 2011

Даже если ваш XSLT содержит инструкцию для сохранения пробела, она может не сохраниться, когда ваш входной XML-документ был проанализирован перед передачей в ваш XSLT.

Вы не указали, какой язык / платформу или что вы используете, поэтому сложно предложить конкретное решение, но я знаю в C #, если вы читаете XML-документ, подобный этому:

string xmlSource = @"<Document>etc..</Document>";
XmlDocument doc = new XmlDocument();
doc.LoadXml(xmlSource);

Он уже будет обрабатывать любые элементы, содержащие только пробел, как пустые элементы, а у doc это пространство уже будет удалено до того, как вы попробуете применить таблицу стилей.

В C # вам нужно сделать это:

XmlDocument doc = new XmlDocument { PreserveWhitespace = true };

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

Более общее решение (хотя и немного громоздкое) состоит в том, чтобы изменить ваш входной XML следующим образом:

...
  <AuthorNotes xml:space="preserve">                    </AuthorNotes>
...

Я думаю, вы можете применить это к корневому элементу, но я не уверен на 100% в этом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...