gpt4 book ai didi

html - 两步 View 模式 : XSLT vs. 对象图

转载 作者:太空宇宙 更新时间:2023-11-04 15:42:47 24 4
gpt4 key购买 nike

我打算实现 Martin Fowler 的 Two-Step View Pattern 用于在我正在编写的 Web 应用程序中呈现 HTML。一般的想法是,它不是让应用程序输出原始 HTML,而是输出一个自定义的中间 XML,然后将其转换为 HTML/CSS。这具有许多优势,包括减少代码重复和更一致的输出。

Fowler 建议的将 XML 转换为最终 HTML 的方法是使用 XSLT。

我以前使用过 XSLT,并且了解基础知识。但是,我想知道使用 XSLT 的优点是什么。我正在考虑的另一种方法如下所示:

这是第一个渲染步骤的示例 XML 输出:

<grid>
<headingRow>
<cell>Product</cell>
<cell>Price</cell>
</headingRow>
<row>
<cell>A product</cell>
<cell type="price">$54.95</cell>
</row>
</grid>

以及所需的最终 HTML 输出:

<table class="grid">
<tr>
<th>Product</th>
<th>Price</th>
</tr>
<tr>
<td>A product</td>
<td>
<span class="currency_symbol">$</span>
<span class="decimal_number">54.95</span>
</td>
</tr>
</table>

我正在考虑的方法是每个标签都有一个对象。

class GridTag extends Tag {
...
public void render() {
System.out.println("<table class=\"grid\">");
foreach(Tag child: children) {
child.render();
}
System.out.println("</table>");
}
...
}

对象将通过解析 XML 构造成树。 render() 方法将在根节点上调用。我特别喜欢这种方法,因为它让我可以做很酷的事情。特别是,如果我有一个带有属性 type="price"的单元格标签:

<cell type="price">$54.95</price>

它关联的 Tag 类可以解析标签的内容,将货币符号和数值分离到单独的 HTML 标签中,以允许货币符号和小数点对齐,如上面的 HTML 输出所示。

<td>
<span class="currency_symbol">$</span>
<span class="decimal_number">54.95</span>
</td>

问题:

我应该这样做还是应该使用 XSLT?我可能会错过使用 XSLT 的哪些优势?如果我应该使用 XSLT,我将如何解析价格标签的内容?

最佳答案

我真的不能说太多为什么你应该选择其中之一。

我认为这在很大程度上取决于您的呈现过程的技术细节,无论您希望它发生在服务器还是浏览器上,您对 XSLT 或 XSLT 替代品的熟悉程度。

XSLT 的一点 肯定是几乎不可能生成格式不正确的 XML 输出(我不是在说有效)。写字符串时很容易漏掉一些东西。

关于您的解析问题:毫无疑问,最好的方法是在 XML 中将数据和格式分开。 XSLT 不用于解析,所以我不明白为什么您的 XML 从一开始就不能采用这种格式:

<cell type="price" symbol="$">54.95</cell>

但是,假设您对此无能为力,这个 XSLT 会处理它。

<xsl:template match="cell[@type='price']">
<td>
<xsl:variable name="vNonNumbers" select="translate(., '0123456789.', '')" />
<xsl:variable name="vTheNumbers" select="translate(., $vNonNumbers, '')" />
<span class="currency_symbol">
<xsl:value-of select="$vNonNumbers" />
</span>
<span class="decimal_number">
<xsl:value-of select="$vTheNumbers" />
</span>
</td>
</xsl:template>

我希望您能明白为什么上面的代码本质上是错误的代码。与备选方案比较(如果您的 XML 分隔数据和格式):

<xsl:template match="cell[@type='price']">
<td>
<span class="currency_symbol">
<xsl:value-of select="@symbol" />
</span>
<span class="decimal_number">
<xsl:value-of select="." />
</span>
</td>
</xsl:template>

关于html - 两步 View 模式 : XSLT vs. 对象图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1023281/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com