通过 prettyprint 正确表示的代码
Code for correct representation via prettyprint
我的代码表示有问题。这由我的 XSLT 正确处理,但输出很丑陋并且不符合预期。通常,pretty-print
-Function 可以完美运行,但在我进行更改后就不行了,我不知道该怎么做。我认为我在这里使用的 <xsl:apply-templates>
有问题。有没有办法在漂亮打印后得到漂亮的代码?
注意:我使用的是 XSLT 版本 1,我正在使用 Altova XMLSpy 进行编码。
这是我的 XML:
<University>
<Students>
<Info>Example 01</Info>
<List>
<ListEntry>
<Info>This is my first entry.</Info>
</ListEntry>
<ListEntry>
<Info>This is my second entry.</Info>
</ListEntry>
</List>
</Students>
<Students>
<Info>Example 02</Info>
</Students>
<Students>
<Info>Example 03</Info>
</Students>
<AlternativeStudents>
<Students>
<Info>Alternative Example 04</Info>
<Info>Alternative Example 05</Info>
</Students>
</AlternativeStudents>
</University>
这是我的 XSLT:
<!-- UNIVERSITY -->
<xsl:template match="University">
<div data-class="greycontainer">
<p data-role="heading">
<xsl:text>STUDENTS</xsl:text>
</p>
<ul>
<xsl:apply-templates/>
</ul>
</div>
</xsl:template>
<!-- STUDENTS -->
<xsl:template match="Students">
<xsl:apply-templates/>
<!-- "or" for AlternativeStudents -->
<xsl:if test="following-sibling::*[1][self::AlternativeStudents]">
<li class="parablock bold_">
<xsl:text>or</xsl:text>
</li>
</xsl:if>
</xsl:template>
<!-- ALTERNATIVESTUDENTS -->
<xsl:template match="AlternativeStudents>
<xsl:apply-templates/>
</xsl:template>
<!-- INFO IN LISTENTRY AND STUDENTS -->
<xsl:template match="ListEntry/Info | Students/Info">
<xsl:choose>
<!-- First -->
<xsl:when test="name(preceding-siblings::*[1])!='Info'">
<li>
<xsl:apply-templates/>
</li>
</xsl:when>
<!-- Following -->
<xsl:otherwise>
<li class="parablock">
<xsl:apply-templates/>
</li>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<!-- LIST -->
<xsl:template match="List">
<ul>
<xsl:apply-templates/>
</ul>
</xsl:template>
<!-- LISTENTRY -->
<xsl:template match="ListEntry>
<xsl:apply-templates/>
</xsl:template>
正如我提到的,结果是正确的,只是缩进和演示。它应该是这样的:
<div data-class="greycontainer">
<p data-role="heading">STUDENTS</p>
<ul>
<li>Example 01</li>
<ul>
<li>This is the first entry.</li>
<li>This is the second entry.</li>
</ul>
<li>Example 02</li>
<li>Example 03</li>
<li class="parablock bold_">or</li>
<li>AlternativeExample 04</li>
<li class="parablock">AlternativeExample 05</li>
</ul>
</div>
但目前看起来是这样的:
<div data-class="greycontainer"><p data-role="heading">STUDENTS</p><ul>
<li>Example 01</li>
<ul>
<li>This is the first entry.</li>
<li>This is the second entry.</li>
</ul>
<li>Example 02</li>
<li>Example 03</li>
<li class="parablock bold_">or</li>
<li>AlternativeExample 04</li>
<li class="parablock">AlternativeExample 05</li>
</ul></div>
如果您想要一致的缩进并且没有混合内容输入,那么最简单的方法通常是同时添加 white-space 剥离和标识,例如
<xsl:output method="html" indent="yes"/>
<xsl:strip-space elements="*"/>
(输出方法 html
不是必需的,但您的输出格式似乎是 HTML,因此如果您以已知的方式告诉 XSLT 处理器,您可能会得到更好的结果 HTML 内联元素或空元素根据 HTML 规则而不是 XML 规则进行序列化。
您在 https://xsltfiddle.liberty-development.net/bdxtqK/2 中的示例似乎符合建议的方法。
我的代码表示有问题。这由我的 XSLT 正确处理,但输出很丑陋并且不符合预期。通常,pretty-print
-Function 可以完美运行,但在我进行更改后就不行了,我不知道该怎么做。我认为我在这里使用的 <xsl:apply-templates>
有问题。有没有办法在漂亮打印后得到漂亮的代码?
注意:我使用的是 XSLT 版本 1,我正在使用 Altova XMLSpy 进行编码。
这是我的 XML:
<University>
<Students>
<Info>Example 01</Info>
<List>
<ListEntry>
<Info>This is my first entry.</Info>
</ListEntry>
<ListEntry>
<Info>This is my second entry.</Info>
</ListEntry>
</List>
</Students>
<Students>
<Info>Example 02</Info>
</Students>
<Students>
<Info>Example 03</Info>
</Students>
<AlternativeStudents>
<Students>
<Info>Alternative Example 04</Info>
<Info>Alternative Example 05</Info>
</Students>
</AlternativeStudents>
</University>
这是我的 XSLT:
<!-- UNIVERSITY -->
<xsl:template match="University">
<div data-class="greycontainer">
<p data-role="heading">
<xsl:text>STUDENTS</xsl:text>
</p>
<ul>
<xsl:apply-templates/>
</ul>
</div>
</xsl:template>
<!-- STUDENTS -->
<xsl:template match="Students">
<xsl:apply-templates/>
<!-- "or" for AlternativeStudents -->
<xsl:if test="following-sibling::*[1][self::AlternativeStudents]">
<li class="parablock bold_">
<xsl:text>or</xsl:text>
</li>
</xsl:if>
</xsl:template>
<!-- ALTERNATIVESTUDENTS -->
<xsl:template match="AlternativeStudents>
<xsl:apply-templates/>
</xsl:template>
<!-- INFO IN LISTENTRY AND STUDENTS -->
<xsl:template match="ListEntry/Info | Students/Info">
<xsl:choose>
<!-- First -->
<xsl:when test="name(preceding-siblings::*[1])!='Info'">
<li>
<xsl:apply-templates/>
</li>
</xsl:when>
<!-- Following -->
<xsl:otherwise>
<li class="parablock">
<xsl:apply-templates/>
</li>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<!-- LIST -->
<xsl:template match="List">
<ul>
<xsl:apply-templates/>
</ul>
</xsl:template>
<!-- LISTENTRY -->
<xsl:template match="ListEntry>
<xsl:apply-templates/>
</xsl:template>
正如我提到的,结果是正确的,只是缩进和演示。它应该是这样的:
<div data-class="greycontainer">
<p data-role="heading">STUDENTS</p>
<ul>
<li>Example 01</li>
<ul>
<li>This is the first entry.</li>
<li>This is the second entry.</li>
</ul>
<li>Example 02</li>
<li>Example 03</li>
<li class="parablock bold_">or</li>
<li>AlternativeExample 04</li>
<li class="parablock">AlternativeExample 05</li>
</ul>
</div>
但目前看起来是这样的:
<div data-class="greycontainer"><p data-role="heading">STUDENTS</p><ul>
<li>Example 01</li>
<ul>
<li>This is the first entry.</li>
<li>This is the second entry.</li>
</ul>
<li>Example 02</li>
<li>Example 03</li>
<li class="parablock bold_">or</li>
<li>AlternativeExample 04</li>
<li class="parablock">AlternativeExample 05</li>
</ul></div>
如果您想要一致的缩进并且没有混合内容输入,那么最简单的方法通常是同时添加 white-space 剥离和标识,例如
<xsl:output method="html" indent="yes"/>
<xsl:strip-space elements="*"/>
(输出方法 html
不是必需的,但您的输出格式似乎是 HTML,因此如果您以已知的方式告诉 XSLT 处理器,您可能会得到更好的结果 HTML 内联元素或空元素根据 HTML 规则而不是 XML 规则进行序列化。
您在 https://xsltfiddle.liberty-development.net/bdxtqK/2 中的示例似乎符合建议的方法。