【问题标题】:Restrict element creation in XSLT if value is empty如果值为空,则限制 XSLT 中的元素创建
【发布时间】:2020-01-21 11:17:57
【问题描述】:

当且仅当源 XML 的元素值不为空时,我想在目标 XML 中创建新元素。我可以使用下面的代码来做到这一点。但是,我的问题是我有大约 5k 场以类似的条件包装。我们有没有更好的方法来处理这个问题?

<xsl:if test="edi:po-num"> //wanted to avoid this for each element
    <xsl:element name="element">
        <xsl:attribute name="name">order_reference_number</xsl:attribute>
        <xsl:value-of select="edi:po-num"/>
    </xsl:element>
</xsl:if>

要转换的java代码:

Transformer trans = StylesheetCache.newTransformer(xslFilePath);
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
trans.transform(source, new StreamResult(outputStream));

【问题讨论】:

  • 定义“空”。您的代码检查是否存在 po-num 元素,如果这是您唯一关心的问题,那么当然应该更容易通过创建 &lt;element name="order_reference_number"&gt;&lt;xsl:value-of select="."/&gt;&lt;/element&gt; 的模板使用 apply-templates 推送现有节点,或者可能参数化 name属性值。
  • 请(在所有 XSLT 问题中)说出您使用的是哪个 XSLT 版本。 2.0 和 3.0 中有许多功能对卡在 1.0 上的用户不可用。
  • @MichaelKay 已更新 XSLT 版本...
  • 您的问题不清楚。请张贴minimal reproducible example 显示带有多个“字段”的输入示例和预期结果。

标签: java xml xslt-1.0


【解决方案1】:

您在 XSLT 1.0 中的选择是有限的 - XSLT 1.0 代码往往很冗长。但如果它确实是重复的,那么您可以考虑编写一个元样式表 - 一个 XSLT 样式表,它可以根据需要做什么的更高级别的描述生成您的样式表。

另外请注意,如果您使用文字结果元素和属性值模板而不是 xsl:elementxsl:attribute,您的代码将不会那么冗长。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多