p 段落的数量不是一个。我没有让这个xslt工作,需要所有 p 节点。相反,它只需要第一个。此外,它将它们混合起来"使用 i 节点。
这是xml:
<doc>
<article>
<texte>
<notes>-</notes>
<content>
<title>T 1</title>
<argument>Arg 1</argument>
<p>Paragraph 1.1</p>
<p>Paragraph 1.2</p>
<p>Paragraph <i>1.3</i></p>
<short-author>FB</short-author>
</content>
<notes>-</notes>
<content>
<title>T2</title>
<p>Paragraph 2.1</p>
<short-author>JD</short-author>
</content>
<notes>-</notes>
<content>
<title>T3</title>
<argument>Arg 3</argument>
<p>Paragraph 3.1</p>
<short-author>NC</short-author>
</content>
</texte>
</article>
</doc>
这是xsl
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/">
<article>
<xsl:text></xsl:text>
<xsl:for-each select="doc/article/texte/content">
<xsl:for-each select="preceding-sibling::notes[1]">
<notes>
<xsl:value-of select="." />
</notes>
</xsl:for-each>
<xsl:text></xsl:text>
<title>
<xsl:value-of select="title" />
</title>
<xsl:text></xsl:text>
<argument>
<xsl:value-of select="argument" />
</argument>
<xsl:text></xsl:text>
<p>
<xsl:value-of select="p" />
<xsl:for-each select="child::*[i]">
<i>
<xsl:value-of select="i" />
</i>
</xsl:for-each>
</p>
<xsl:text></xsl:text>
<short-author>
<xsl:value-of select="short-author" />
</short-author>
<xsl:text></xsl:text>
</xsl:for-each>
</article>
</xsl:template>
</xsl:stylesheet>
这是结果
<?xml version="1.0"?>
<article>
<notes>-</notes>
<title>T 1</title>
<argument>Arg 1</argument>
<p>Paragraph 1.1<i>1.3</i></p>
<short-author>FB</short-author>
<notes>-</notes>
<title>T2</title>
<argument/>
<p>Paragraph 2.1</p>
<short-author>JD</short-author>
<notes>-</notes>
<title>T3</title>
<argument>Arg 3</argument>
<p>Paragraph 3.1</p>
<short-author>NC</short-author>
</article>
非常感谢!
答案 0 :(得分:-1)
如果我正确地猜测你在这里尝试做什么,你可以通过以下方式轻松完成:
XSLT 1.0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<!-- identity transform -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="/doc">
<article>
<xsl:apply-templates select="article/texte/*"/>
</article>
</xsl:template>
</xsl:stylesheet>
备注:
要解决您一直在做的事情,您必须执行以下操作:
<xsl:for-each select="p">
<p>
<xsl:copy-of select="node()" />
</p>
</xsl:for-each>
而不是:
<p><xsl:value-of select="p" />
<xsl:for-each select="child::*[i]">
<i><xsl:value-of select="i" /></i>
</xsl:for-each>
</p>
请注意<xsl:for-each select="child::*[i]">
无论如何都不会在这里工作,因为(a)上下文节点是content
,而不是p
和(b)它没有做你认为它做了什么。
P.S。您不需要手动插入换行符。