Я использую Apache FOP для создания PDF-файлов.
Часть моего XML выглядит, как показано ниже. По сути, я пытаюсь поместить все содержимое тегов в том виде, в каком оно есть в PDF-файле, и здесь у меня возникла небольшая проблема. Я хотел бы иметь пустое место, когда есть пустой тег TEXT:
"<Text></Text>"
XML:
<Text>NUMBER : 123456 ABCDE - ASBI</Text>
<Text>REFERENCENUMBER : TECNO - ENOS-B</Text>
<Text></Text>
<Text>USER 1 : COMPANY XYZ</Text>
<Text> TECH CENTER1</Text>
<Text> XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXX X XX</Text>
<Text> 0000 XXXXXXXXXXXXXXXXXXXX</Text>
<Text>USER 2 : COMPANY MNO</Text>
<Text> TECH CENTER2</Text>
<Text> XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXX X XX</Text>
<Text> 0000 XXXXXXXXXXXXXXXXXXXX</Text>
<Text></Text>
<Text>QTY. SUBSCRIPTION PRICE, OPTICAL CAPACITY</Text>
Мой код состоит из блока for-each в узле Text:
<xsl:for-each select = "Text">
<fo:table-row>
<fo:table-cell>
<fo:block font-family = "Courier" font-size = "7pt" font-weight = "normal" display-align = "center" white-space = "pre">
<xsl:value-of select = "."/>
</fo:block>
</fo:table-cell>
</fo:table-row>
</xsl:for-each>
Я могу добиться пробелов в теге, используя White-space="pre". Но как мне получить пустую строку? Мой вывод выглядит следующим образом:
NUMBER : 123456 ABCDE - ASBI
REFERENCENUMBER : TECNO - ENOS-B
USER 1 : COMPANY XYZ
TECH CENTER1
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXX X XX
0000 XXXXXXXXXXXXXXXXXXXX
USER 2 : COMPANY MNO
TECH CENTER2
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXX X XX
0000 XXXXXXXXXXXXXXXXXXXX
QTY. SUBSCRIPTION PRICE, OPTICAL CAPACITY
Ожидаемый результат:
NUMBER : 123456 ABCDE - ASBI
REFERENCENUMBER : TECNO - ENOS-B
USER 1 : COMPANY XYZ
TECH CENTER1
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXX X XX
0000 XXXXXXXXXXXXXXXXXXXX
USER 2 : COMPANY MNO
TECH CENTER2
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXX X XX
0000 XXXXXXXXXXXXXXXXXXXX
QTY. SUBSCRIPTION PRICE, OPTICAL CAPACITY
Нет, не работает :( Хотя я нашел обходной путь. Публикую ответ ниже.





Я добавил проверку и всё заработало:
<xsl:for-each select = "Text">
<fo:table-row >
<fo:table-cell>
<fo:block font-family = "Courier" font-size = "7pt" font-weight = "normal" display-align = "center" white-space = "pre">
<xsl:value-of select = "."/>
<xsl:if test = "string-length(.) = 0">
<xsl:text> </xsl:text>
</xsl:if>
</fo:block>
</fo:table-cell>
</fo:table-row>
</xsl:for-each>
Сокращение white-space = "pre" также сохраняет перевод строки, поскольку оно также устанавливает linefeed-treatment = "preserve". (См. https://www.w3.org/TR/xsl11/#white-space и https://www.w3.org/TR/xsl11/#linefeed-treatment)
Таким образом, вы можете поместить все свои Text в один fo:block и сгенерировать перевод строки после строкового значения каждого Text:
<xsl:template match = "Block">
<fo:block font-family = "Courier" font-size = "7pt" white-space = "pre">
<xsl:apply-templates select = "Text" />
</fo:block>
</xsl:template>
<xsl:template match = "Text">
<xsl:value-of select = "." />
<xsl:text>
</xsl:text>
</xsl:template>
Пустой Text генерирует только перевод строки.
Вы не показали, что происходит вокруг вашего Text, поэтому я придумал элемент Block.
Попробуйте
<fo:table empty-cells = "show" ...>...</fo:table>изменить/улучшить ситуацию.