Xml 在新父节点/元素中换行节点

Xml 在新父节点/元素中换行节点,xml,xslt,nodes,word-wrap,Xml,Xslt,Nodes,Word Wrap,我正在尝试将包装到div元素中 示例代码: <xsl:variable name="smallcase" select="'abcdefghijklmnopqrstuvwxyz'" /> <xsl:variable name="uppercase" select="'ABCDEFGHIJKLMNOPQRSTUVWXYZ'" /> <p>...</p> <p>...</p> <code-text ATTRIBUTE="

我正在尝试将
包装到
div
元素中

示例代码:

<xsl:variable name="smallcase" select="'abcdefghijklmnopqrstuvwxyz'" />
<xsl:variable name="uppercase" select="'ABCDEFGHIJKLMNOPQRSTUVWXYZ'" />

<p>...</p>
<p>...</p>
<code-text ATTRIBUTE="JSON">...</code-text>
<code-text ATTRIBUTE="SOAP">...</code-text>
<p>...</p>
<code-text ATTRIBUTE="JSON">...</code-text>
<code-text ATTRIBUTE="SOAP">...</code-text>
<code-text ATTRIBUTE="JSON">...</code-text>
<code-text ATTRIBUTE="SOAP">...</code-text>
<p>...</p>
<p>...</p>
<code-text ATTRIBUTE="JSON">...</code-text>
<code-text ATTRIBUTE="SOAP">...</code-text>
<xsl:template match="code-text[@ATTRIBUTE]">
    <xsl:element name="div">
        <xsl:attribute name="class">
            <xsl:text>codes</xsl:text>
        </xsl:attribute>
        <xsl:call-template name="code-text" />
    </xsl:element>
    <xsl:apply-templates select="following-sibling::node()[not(self::code-text[@ATTRIBUTE])][1]" />
</xsl:template>
<xsl:template match="code-text[@ATTRIBUTE][preceding-sibling::node()[1]/self::code-text[@ATTRIBUTE]]" name="code-text">
    <xsl:text>Code goes here: </xsl:text><xsl:value-of select="translate(@ATTRIBUTE, $uppercase, $smallcase)" /><xsl:element name="br" />
    <xsl:apply-templates select="following-sibling::node()[1]/self::code-text[@ATTRIBUTE]" />
</xsl:template>
<div class="codes">
Code goes here: JSON<br>
Code goes here: SOAP
</div>
<p>...</p>
Code goes here :SOAP
<p>...</p>
<code-text ATTRIBUTE="JSON">...</code-text>
<code-text ATTRIBUTE="SOAP">...</code-text>
<code-text ATTRIBUTE="JSON">...</code-text>
<code-text ATTRIBUTE="SOAP">...</code-text>

... ...

... ... ... ...

... ...
我已经在这个网站上看到了一些建议,但是当我复制他们的解决方案时,它并没有100%起作用。 我得到的最接近的是from,但出于某种原因,它还在后面不断添加段落

这就是我的基本情况:

<xsl:variable name="smallcase" select="'abcdefghijklmnopqrstuvwxyz'" />
<xsl:variable name="uppercase" select="'ABCDEFGHIJKLMNOPQRSTUVWXYZ'" />

<p>...</p>
<p>...</p>
<code-text ATTRIBUTE="JSON">...</code-text>
<code-text ATTRIBUTE="SOAP">...</code-text>
<p>...</p>
<code-text ATTRIBUTE="JSON">...</code-text>
<code-text ATTRIBUTE="SOAP">...</code-text>
<code-text ATTRIBUTE="JSON">...</code-text>
<code-text ATTRIBUTE="SOAP">...</code-text>
<p>...</p>
<p>...</p>
<code-text ATTRIBUTE="JSON">...</code-text>
<code-text ATTRIBUTE="SOAP">...</code-text>
<xsl:template match="code-text[@ATTRIBUTE]">
    <xsl:element name="div">
        <xsl:attribute name="class">
            <xsl:text>codes</xsl:text>
        </xsl:attribute>
        <xsl:call-template name="code-text" />
    </xsl:element>
    <xsl:apply-templates select="following-sibling::node()[not(self::code-text[@ATTRIBUTE])][1]" />
</xsl:template>
<xsl:template match="code-text[@ATTRIBUTE][preceding-sibling::node()[1]/self::code-text[@ATTRIBUTE]]" name="code-text">
    <xsl:text>Code goes here: </xsl:text><xsl:value-of select="translate(@ATTRIBUTE, $uppercase, $smallcase)" /><xsl:element name="br" />
    <xsl:apply-templates select="following-sibling::node()[1]/self::code-text[@ATTRIBUTE]" />
</xsl:template>
<div class="codes">
Code goes here: JSON<br>
Code goes here: SOAP
</div>
<p>...</p>
Code goes here :SOAP
<p>...</p>
<code-text ATTRIBUTE="JSON">...</code-text>
<code-text ATTRIBUTE="SOAP">...</code-text>
<code-text ATTRIBUTE="JSON">...</code-text>
<code-text ATTRIBUTE="SOAP">...</code-text>

代码
代码如下:
但这会输出:

<xsl:variable name="smallcase" select="'abcdefghijklmnopqrstuvwxyz'" />
<xsl:variable name="uppercase" select="'ABCDEFGHIJKLMNOPQRSTUVWXYZ'" />

<p>...</p>
<p>...</p>
<code-text ATTRIBUTE="JSON">...</code-text>
<code-text ATTRIBUTE="SOAP">...</code-text>
<p>...</p>
<code-text ATTRIBUTE="JSON">...</code-text>
<code-text ATTRIBUTE="SOAP">...</code-text>
<code-text ATTRIBUTE="JSON">...</code-text>
<code-text ATTRIBUTE="SOAP">...</code-text>
<p>...</p>
<p>...</p>
<code-text ATTRIBUTE="JSON">...</code-text>
<code-text ATTRIBUTE="SOAP">...</code-text>
<xsl:template match="code-text[@ATTRIBUTE]">
    <xsl:element name="div">
        <xsl:attribute name="class">
            <xsl:text>codes</xsl:text>
        </xsl:attribute>
        <xsl:call-template name="code-text" />
    </xsl:element>
    <xsl:apply-templates select="following-sibling::node()[not(self::code-text[@ATTRIBUTE])][1]" />
</xsl:template>
<xsl:template match="code-text[@ATTRIBUTE][preceding-sibling::node()[1]/self::code-text[@ATTRIBUTE]]" name="code-text">
    <xsl:text>Code goes here: </xsl:text><xsl:value-of select="translate(@ATTRIBUTE, $uppercase, $smallcase)" /><xsl:element name="br" />
    <xsl:apply-templates select="following-sibling::node()[1]/self::code-text[@ATTRIBUTE]" />
</xsl:template>
<div class="codes">
Code goes here: JSON<br>
Code goes here: SOAP
</div>
<p>...</p>
Code goes here :SOAP
<p>...</p>
<code-text ATTRIBUTE="JSON">...</code-text>
<code-text ATTRIBUTE="SOAP">...</code-text>
<code-text ATTRIBUTE="JSON">...</code-text>
<code-text ATTRIBUTE="SOAP">...</code-text>

代码如下:JSON
这里的代码是:SOAP

这里的代码是:SOAP

因此,最后一个SOAP和它后面的段落是重复的

我想:

<div class="codes">
Code goes here: JSON<br>
Code goes here: SOAP
</div>
<p>...</p>
etc...etc...etc

代码如下:JSON
这里的代码是:SOAP

等等…等等…等等
更新 要澄清重复json/soap/json/soap的问题,请执行以下操作:

<xsl:variable name="smallcase" select="'abcdefghijklmnopqrstuvwxyz'" />
<xsl:variable name="uppercase" select="'ABCDEFGHIJKLMNOPQRSTUVWXYZ'" />

<p>...</p>
<p>...</p>
<code-text ATTRIBUTE="JSON">...</code-text>
<code-text ATTRIBUTE="SOAP">...</code-text>
<p>...</p>
<code-text ATTRIBUTE="JSON">...</code-text>
<code-text ATTRIBUTE="SOAP">...</code-text>
<code-text ATTRIBUTE="JSON">...</code-text>
<code-text ATTRIBUTE="SOAP">...</code-text>
<p>...</p>
<p>...</p>
<code-text ATTRIBUTE="JSON">...</code-text>
<code-text ATTRIBUTE="SOAP">...</code-text>
<xsl:template match="code-text[@ATTRIBUTE]">
    <xsl:element name="div">
        <xsl:attribute name="class">
            <xsl:text>codes</xsl:text>
        </xsl:attribute>
        <xsl:call-template name="code-text" />
    </xsl:element>
    <xsl:apply-templates select="following-sibling::node()[not(self::code-text[@ATTRIBUTE])][1]" />
</xsl:template>
<xsl:template match="code-text[@ATTRIBUTE][preceding-sibling::node()[1]/self::code-text[@ATTRIBUTE]]" name="code-text">
    <xsl:text>Code goes here: </xsl:text><xsl:value-of select="translate(@ATTRIBUTE, $uppercase, $smallcase)" /><xsl:element name="br" />
    <xsl:apply-templates select="following-sibling::node()[1]/self::code-text[@ATTRIBUTE]" />
</xsl:template>
<div class="codes">
Code goes here: JSON<br>
Code goes here: SOAP
</div>
<p>...</p>
Code goes here :SOAP
<p>...</p>
<code-text ATTRIBUTE="JSON">...</code-text>
<code-text ATTRIBUTE="SOAP">...</code-text>
<code-text ATTRIBUTE="JSON">...</code-text>
<code-text ATTRIBUTE="SOAP">...</code-text>
。。。
...
...
...
我想成为:

<div class="codes">
Code goes here: JSON<br>
Code goes here: SOAP
</div>
<div class="codes">
Code goes here: JSON<br>
Code goes here: SOAP
</div>

代码如下:JSON
这里的代码是:SOAP 代码如下:JSON
这里的代码是:SOAP
而不是:

<div class="codes">
Code goes here: JSON<br>
Code goes here: SOAP<br>
Code goes here: JSON<br>
Code goes here: SOAP
</div>

代码如下:JSON
代码如下:SOAP
代码如下:JSON
这里的代码是:SOAP
XSLT 1.0样式表

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="1.0">

    <xsl:output method="html"/>

    <xsl:variable name="smallcase" select="'abcdefghijklmnopqrstuvwxyz'" />
    <xsl:variable name="uppercase" select="'ABCDEFGHIJKLMNOPQRSTUVWXYZ'" />

    <xsl:key name="head"
        match="code-text[@ATTRIBUTE][preceding-sibling::*[1][self::code-text[@ATTRIBUTE]]]"
        use="generate-id(preceding-sibling::code-text[not(preceding-sibling::*[1][self::code-text[@ATTRIBUTE]])][1])"/>

    <xsl:template match="@* | node()">
        <xsl:copy>
            <xsl:apply-templates select="@* | node()"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="code-text[not(preceding-sibling::*[1][self::code-text[@ATTRIBUTE]])]">
        <div class="codes">
            <xsl:apply-templates select=". | key('head', generate-id())" mode="output"/>
        </div>
    </xsl:template>

    <xsl:template match="code-text[@ATTRIBUTE][preceding-sibling::*[1][self::code-text[@ATTRIBUTE]]]"/>

    <xsl:template match="code-text" mode="output">
        <xsl:text>Code goes here: </xsl:text><xsl:value-of select="translate(@ATTRIBUTE, $uppercase, $smallcase)" /><br/>
    </xsl:template>
</xsl:stylesheet>

代码如下:
转变

<body>
    <p>...</p>
    <p>...</p>
    <code-text ATTRIBUTE="JSON">...</code-text>
    <code-text ATTRIBUTE="SOAP">...</code-text>
    <p>...</p>
    <code-text ATTRIBUTE="JSON">...</code-text>
    <code-text ATTRIBUTE="SOAP">...</code-text>
    <code-text ATTRIBUTE="JSON">...</code-text>
    <code-text ATTRIBUTE="SOAP">...</code-text>
    <p>...</p>
    <p>...</p>
    <code-text ATTRIBUTE="JSON">...</code-text>
    <code-text ATTRIBUTE="SOAP">...</code-text>
</body>

... ...

... ... ... ...

... ...
进入

代码放在这里:json
代码放在这里:soap

代码放在这里:json
代码放在这里:soap
代码放在这里:json
代码放在这里:soap

代码放在这里:json
代码放在这里:soap

XSLT 1.0样式表

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="1.0">

    <xsl:output method="html"/>

    <xsl:variable name="smallcase" select="'abcdefghijklmnopqrstuvwxyz'" />
    <xsl:variable name="uppercase" select="'ABCDEFGHIJKLMNOPQRSTUVWXYZ'" />

    <xsl:key name="head"
        match="code-text[@ATTRIBUTE][preceding-sibling::*[1][self::code-text[@ATTRIBUTE]]]"
        use="generate-id(preceding-sibling::code-text[not(preceding-sibling::*[1][self::code-text[@ATTRIBUTE]])][1])"/>

    <xsl:template match="@* | node()">
        <xsl:copy>
            <xsl:apply-templates select="@* | node()"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="code-text[not(preceding-sibling::*[1][self::code-text[@ATTRIBUTE]])]">
        <div class="codes">
            <xsl:apply-templates select=". | key('head', generate-id())" mode="output"/>
        </div>
    </xsl:template>

    <xsl:template match="code-text[@ATTRIBUTE][preceding-sibling::*[1][self::code-text[@ATTRIBUTE]]]"/>

    <xsl:template match="code-text" mode="output">
        <xsl:text>Code goes here: </xsl:text><xsl:value-of select="translate(@ATTRIBUTE, $uppercase, $smallcase)" /><br/>
    </xsl:template>
</xsl:stylesheet>

代码如下:
转变

<body>
    <p>...</p>
    <p>...</p>
    <code-text ATTRIBUTE="JSON">...</code-text>
    <code-text ATTRIBUTE="SOAP">...</code-text>
    <p>...</p>
    <code-text ATTRIBUTE="JSON">...</code-text>
    <code-text ATTRIBUTE="SOAP">...</code-text>
    <code-text ATTRIBUTE="JSON">...</code-text>
    <code-text ATTRIBUTE="SOAP">...</code-text>
    <p>...</p>
    <p>...</p>
    <code-text ATTRIBUTE="JSON">...</code-text>
    <code-text ATTRIBUTE="SOAP">...</code-text>
</body>

... ...

... ... ... ...

... ...
进入

代码放在这里:json
代码放在这里:soap

代码放在这里:json
代码放在这里:soap
代码放在这里:json
代码放在这里:soap

代码放在这里:json
代码放在这里:soap

要为
的每对创建
div
,只需执行以下操作:

XSLT1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" omit-xml-declaration="yes" 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="/root">
    <body>
        <xsl:apply-templates select="p | code-text[@ATTRIBUTE='JSON']"/>
    </body>
</xsl:template>

<xsl:template match="code-text">
     <div class="codes">
        <xsl:value-of select="." />
        <br/>
        <xsl:value-of select="following-sibling::code-text[1]" />
     </div>
</xsl:template>

</xsl:stylesheet>


应用于以下格式良好的输入示例:

XML

<root>
    <p>a</p>
    <p>b</p>
    <code-text ATTRIBUTE="JSON">c1</code-text>
    <code-text ATTRIBUTE="SOAP">c2</code-text>
    <p>d</p>
    <code-text ATTRIBUTE="JSON">e1</code-text>
    <code-text ATTRIBUTE="SOAP">e2</code-text>
    <code-text ATTRIBUTE="JSON">f1</code-text>
    <code-text ATTRIBUTE="SOAP">f2</code-text>
    <p>g</p>
    <p>h</p>
    <code-text ATTRIBUTE="JSON">i1</code-text>
    <code-text ATTRIBUTE="SOAP">i2</code-text>
</root>

a

b

c1 c2 d

e1 e2 f1 f2 g

h

i1 i2
结果将是:

<body>
   <p>a</p>
   <p>b</p>
   <div class="codes">c1<br/>c2</div>
   <p>d</p>
   <div class="codes">e1<br/>e2</div>
   <div class="codes">f1<br/>f2</div>
   <p>g</p>
   <p>h</p>
   <div class="codes">i1<br/>i2</div>
</body>

a

b

c1
c2 d

e1
e2 f1
f2 g

h

i1
i2
要为
的每对创建
div
,只需执行以下操作:

XSLT1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" omit-xml-declaration="yes" 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="/root">
    <body>
        <xsl:apply-templates select="p | code-text[@ATTRIBUTE='JSON']"/>
    </body>
</xsl:template>

<xsl:template match="code-text">
     <div class="codes">
        <xsl:value-of select="." />
        <br/>
        <xsl:value-of select="following-sibling::code-text[1]" />
     </div>
</xsl:template>

</xsl:stylesheet>


应用于以下格式良好的输入示例:

XML

<root>
    <p>a</p>
    <p>b</p>
    <code-text ATTRIBUTE="JSON">c1</code-text>
    <code-text ATTRIBUTE="SOAP">c2</code-text>
    <p>d</p>
    <code-text ATTRIBUTE="JSON">e1</code-text>
    <code-text ATTRIBUTE="SOAP">e2</code-text>
    <code-text ATTRIBUTE="JSON">f1</code-text>
    <code-text ATTRIBUTE="SOAP">f2</code-text>
    <p>g</p>
    <p>h</p>
    <code-text ATTRIBUTE="JSON">i1</code-text>
    <code-text ATTRIBUTE="SOAP">i2</code-text>
</root>

a

b

c1 c2 d

e1 e2 f1 f2 g

h

i1 i2
结果将是:

<body>
   <p>a</p>
   <p>b</p>
   <div class="codes">c1<br/>c2</div>
   <p>d</p>
   <div class="codes">e1<br/>e2</div>
   <div class="codes">f1<br/>f2</div>
   <p>g</p>
   <p>h</p>
   <div class="codes">i1<br/>i2</div>
</body>

a

b

c1
c2 d

e1
e2 f1
f2 g

h

i1
i2
第一个代码示例是否是您要转换的XML输入?如果是,为什么它包含
xsl:variable
元素?另外,您可以对相邻的每个组使用XSLT 2.0和
,还是仅限于XSLT 1.0?xsl:变量可以忽略,它在转换中用于xsl:value of。我认为XSLT1是首选版本,我使用PHP5.6作为解析器,我无法控制它使用的库。但我很确定我所在的服务器在发表评论时只支持1.0。你的“澄清”比澄清更令人困惑。请在给出示例之前用文字解释所需的逻辑。我指的是@MartinHonnen solution,这与我的目标非常接近。只为您做了小更新;)恐怕这对我毫无帮助。我可以这样理解:从
开始,为每组
代码文本
元素创建
div
。或者为每对
创建一个
div
。或者您的示例适合的任何其他可能的解释。第一个代码示例是您要转换的XML输入吗?如果是,为什么它包含
xsl:variable
元素?另外,您可以对相邻的每个组使用XSLT 2.0和
,还是仅限于XSLT 1.0?xsl:变量可以忽略,它在转换中用于xsl:value of。我认为XSLT1是首选版本,我使用PHP5.6作为解析器,我无法控制它使用的库。但我很确定我所在的服务器在发表评论时只支持1.0。你的“澄清”比澄清更令人困惑。请在给出示例之前用文字解释所需的逻辑。我指的是@MartinHonnen solution,这与我的目标非常接近。只为您做了小更新;)恐怕这对我毫无帮助。我可以这样理解:从
开始,为每组
代码文本
元素创建
div
。或者为每对
创建一个
div
。或者其他任何可能的