【问题标题】:Xslt transformationXslt 变换
【发布时间】:2011-02-22 17:40:16
【问题描述】:

我想用 xsl 转换:

<?xml version="1.0" encoding="utf-16"?>
<root>
<value1>test1</value1>
<value2>test2</value2>
<value3>test3</value3>
</root>

在:

<input type="hidden" value="test1" name="value1" />
<input type="hidden" value="test2" name="value2" />
<input type="hidden" value="test3" name="value3" />

最好的方法是什么?

谢谢

【问题讨论】:

    标签: xslt


    【解决方案1】:

    我认为这条规则语义清晰简洁:

    <xsl:template match="*[starts-with(name(),'value')]">
        <input type="hidden" value="{.}" name="{name()}" /> 
    </xsl:template> 
    

    【讨论】:

    • 啊,是的,我完全忘记了starts-with。我使用的语言不止几种,我忘记了哪些语言有哪些字符串函数。
    • 另一种编写匹配模式的方法是match="root/*"
    • @Michael Kay:我同意。这会将模式限制为仅root 的子级。
    【解决方案2】:

    你的 XML 设计不好;如果可能,您应该使用 &lt;value name="value1"&gt; 或类似的东西,而不是 &lt;value1&gt;

    话虽如此,你可以这样做:

    <xsl:template match="*[starts-with(name(),'value')]">
      <xsl:element name="input">
        <xsl:attribute name="type">hidden</xsl:attribute>
        <xsl:attribute name="value">
          <xsl:value-of select="." />
         </xsl:attribute>
        <xsl:attribute name="name">
          <xsl:value-of select="name()" />
        </xsl:attribute>
      </xsl:element>
    </xsl:template>
    

    如果您的元素是&lt;value name="value1"&gt;,则匹配变为简单的match="value",这要快得多,并且名称属性变为&lt;xsl:value-of select="@name"&gt;

    【讨论】:

    • NP;这比使用{} 语法来处理属性要冗长一些,但我个人更喜欢这样做,除非有令人信服的理由不这样做;样式表中没有非 xsl 元素,从而更清楚地准确输出应该是什么。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多