Xslt 身份模板混淆

Xslt 身份模板混淆,xslt,xslt-1.0,Xslt,Xslt 1.0,我试图理解身份模板的功能 <xsl:template match='@* | node()'> <xsl:apply-templates select='@* | node()'/> </xsl:template> 上面的模板如果出现在XSL文档的开头,我们称之为identity template,它的功能是调用所有模板,即通过匹配中@*和node()下的所有内容。然后转到第二行apply-templates,递归地选择所有模板/节点。如果我

我试图理解身份模板的功能

  <xsl:template match='@* | node()'>
  <xsl:apply-templates select='@* | node()'/>
  </xsl:template>

上面的模板如果出现在XSL文档的开头,我们称之为identity template,它的功能是调用所有模板,即通过匹配中@*和node()下的所有内容。然后转到第二行apply-templates,递归地选择所有模板/节点。如果我错了,请纠正我

我的问题是,如果我们把这个模板放在XSLT的中间,而不是开始,我们不希望所有的匹配操作,而只希望某个消息存储在一个变量中,比如

  <xsl:template match='$variable holding entire soap envelope'>
  <xsl:apply-templates select='@* | node()'/>
  </xsl:template>

我们是否仍将其称为标识模板,并将其处理过程与第一个操作中的标识模板相同

对不起,我的问题不清楚


感谢您的帮助。

身份转换模板复制每个节点,使其看起来像

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


对于以变量引用开始的匹配模式,如
match='$variable'
,我认为XSLT1.0中甚至不允许这样做

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


对于以变量引用开始的匹配模式,如
match='$variable'
,我认为XSLT1.0中甚至不允许这样做。

不,覆盖标识转换的模板本身不会被视为标识转换

使用标识转换模板的方法是,默认情况下,让它将所有内容从输入XML复制到输出XML,但在需要时使用更具体的
匹配
模式覆盖标识转换

<强>例如,考虑此SOAP消息:< /强>

<env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope">
  <env:Header>
    <n:alertcontrol xmlns:n="http://example.org/alertcontrol">
      <n:priority>1</n:priority>
      <n:expires>2001-06-22T14:00:00-05:00</n:expires>
    </n:alertcontrol>
  </env:Header>
  <env:Body>
    <m:alert xmlns:m="http://example.org/alert">
      <m:msg>Pick up Mary at school at 2pm</m:msg>
    </m:alert>
  </env:Body>
</env:Envelope>
将上述XSLT应用于输入SOAP消息会生成一条相同的SOAP消息,但具有
m:msg
元素内容

<xsl:stylesheet version="1.0"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:m="http://example.org/alert">
  <xsl:output omit-xml-declaration="yes" indent="yes"/>
  <xsl:strip-space elements="*"/>

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

  <xsl:template match="m:msg">
    <xsl:copy>***Pick up Mary at school at 1pm, not 2pm.***</xsl:copy>
  </xsl:template>

</xsl:stylesheet>
<env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope">
   <env:Header>
      <n:alertcontrol xmlns:n="http://example.org/alertcontrol">
         <n:priority>1</n:priority>
         <n:expires>2001-06-22T14:00:00-05:00</n:expires>
      </n:alertcontrol>
   </env:Header>
   <env:Body>
      <m:alert xmlns:m="http://example.org/alert">
         <m:msg>***Pick up Mary at school at 1pm, not 2pm.***</m:msg>
      </m:alert>
   </env:Body>
</env:Envelope>

1.
2001-06-22T14:00:00-05:00
***下午1点到学校接玛丽,不是下午2点***

否,覆盖标识转换的模板本身不会被视为标识转换

使用标识转换模板的方法是,默认情况下,让它将所有内容从输入XML复制到输出XML,但在需要时使用更具体的
匹配
模式覆盖标识转换

<强>例如,考虑此SOAP消息:< /强>

<env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope">
  <env:Header>
    <n:alertcontrol xmlns:n="http://example.org/alertcontrol">
      <n:priority>1</n:priority>
      <n:expires>2001-06-22T14:00:00-05:00</n:expires>
    </n:alertcontrol>
  </env:Header>
  <env:Body>
    <m:alert xmlns:m="http://example.org/alert">
      <m:msg>Pick up Mary at school at 2pm</m:msg>
    </m:alert>
  </env:Body>
</env:Envelope>
将上述XSLT应用于输入SOAP消息会生成一条相同的SOAP消息,但具有
m:msg
元素内容

<xsl:stylesheet version="1.0"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:m="http://example.org/alert">
  <xsl:output omit-xml-declaration="yes" indent="yes"/>
  <xsl:strip-space elements="*"/>

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

  <xsl:template match="m:msg">
    <xsl:copy>***Pick up Mary at school at 1pm, not 2pm.***</xsl:copy>
  </xsl:template>

</xsl:stylesheet>
<env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope">
   <env:Header>
      <n:alertcontrol xmlns:n="http://example.org/alertcontrol">
         <n:priority>1</n:priority>
         <n:expires>2001-06-22T14:00:00-05:00</n:expires>
      </n:alertcontrol>
   </env:Header>
   <env:Body>
      <m:alert xmlns:m="http://example.org/alert">
         <m:msg>***Pick up Mary at school at 1pm, not 2pm.***</m:msg>
      </m:alert>
   </env:Body>
</env:Envelope>

1.
2001-06-22T14:00:00-05:00
***下午1点到学校接玛丽,不是下午2点***