自定义xhtml标记以减少重复的块

时间:2018-08-03 19:21:53

标签: xml xhtml

我有一个xhtml文件,其中有许多<message>块,但在少数地方出现了单个标识符##IDENTIFIER##,但它们是相同的。注意:##IDENTIFIER##是此消息块中使用的纯文本值的占位符。

<message id="##IDENTIFIER##">
    <div class="box">
        <div class="box-header">
            <div class="box-title">
                <h3 class="box-title-text">Title</h3>
            </div>
            <div class="button">
                ${specialblock: "##IDENTIFIER##"}
            </div>
        </div>
        <div class="edit">
            ${##IDENTIFIER##: "data"}
        </div>
    </div>
</message>

我想做的是制作一个自定义标签,我可以用它来替换上面的代码块,例如:<mymessage value="##IDENTIFIER##"/>

这有可能吗?如果是这样,什么是这样做的好方法?我已经开始研究模式和实体引用,但是我还不太了解它们,并且不确定它们是否会提供我想要的行为。

编辑:如果可以在同一文件中完成操作,我也希望这样做,但是如果需要,我可以添加其他文件。

1 个答案:

答案 0 :(得分:0)

  

我想做的是制作一个自定义标签,用它可以将上述代码块替换为:

<mymessage value="##IDENTIFIER##"/>

您可以使用XSLT(1.0版就足够了)执行此操作。将XML作为输入输入样式表,以将其转换为所需的输出。

例如,如果您有一些XML(例如,名为a.xml

<?xml version="1.0" encoding="UTF-8"?>
<root>
    <message id="##IDENTIFIER003##">
        <div class="box">
            <div class="box-header">
                <div class="box-title">
                    <h3 class="box-title-text">Title</h3>
                </div>
                <div class="button">
                    ${specialblock: "##IDENTIFIER##"}
                </div>
            </div>
            <div class="edit">
                ${##IDENTIFIER##: "data"}
            </div>
        </div>
    </message>
    <message id="##IDENTIFIER001##">
        <div class="box">
            <div class="box-header">
                <div class="box-title">
                    <h3 class="box-title-text">Title</h3>
                </div>
                <div class="button">
                    ${specialblock: "##IDENTIFIER##"}
                </div>
            </div>
            <div class="edit">
                ${##IDENTIFIER##: "data"}
            </div>
        </div>
    </message>
    <message id="##IDENTIFIER002##">
        <div class="box">
            <div class="box-header">
                <div class="box-title">
                    <h3 class="box-title-text">Title</h3>
                </div>
                <div class="button">
                    ${specialblock: "##IDENTIFIER##"}
                </div>
            </div>
            <div class="edit">
                ${##IDENTIFIER##: "data"}
            </div>
        </div>
    </message>    
</root>

应用以下XSLT(例如,名为a.xslt

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes" encoding="utf-8" />

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

  <xsl:template match="message">
    <mymessage value="{@id}" />
  </xsl:template>

</xsl:stylesheet>

将导致以下输出:

<?xml version="1.0" encoding="utf-8"?>
<root>
    <mymessage value="##IDENTIFIER003##"/>
    <mymessage value="##IDENTIFIER001##"/>
    <mymessage value="##IDENTIFIER002##"/>        
</root>

您可以使用任何XSLT处理器执行此任务。
例如,在Linux中,您可以像这样使用xsltproc

xsltproc a.xslt a.xml

对于Windows,也有很多XSLT处理器,只需用谷歌搜索即可。