Xml 为什么我的XSL去掉了所有的标记?

Xml 为什么我的XSL去掉了所有的标记?,xml,xslt,Xml,Xslt,我有一个入站XML(作为web服务): 2017-11-17T13:38:11+00:00 xyz.demo app102.example.com 31632 ..... 我正在对它执行这个XSL: <?xml version='1.0'?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/

我有一个入站XML(作为web服务):


2017-11-17T13:38:11+00:00
xyz.demo
app102.example.com
31632
.....
我正在对它执行这个XSL:

<?xml version='1.0'?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:ms="urn:schemas-microsoft-com:xslt">

<xsl:template match="//Envelope/Body/send_message/user/now">
  <now>
    <xsl:variable name="srcDateTime" select="//Envelope/Body/send_message/user/now"/>
    <xsl:variable name="srcDate" select="substring-before($srcDateTime, 'T')" />
    <xsl:variable name="outDate" select="format-date(xs:date($srcDate),'[D01].[M01].[Y0001]')"/>
    <xsl:copy-of select="$outDate"/>
  </now>
</xsl:template>
</xsl:stylesheet>


我的目的是重新格式化
中的日期。如果希望XML除了
之外不被修改,只需添加标识转换:

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

您的另一个模板将仅在与指定xpath对应的节点上覆盖它
//Envelope/Body/send\u message/user/now


(编辑:如马丁Mü勒指出的,你应该考虑将绝对路径减少到必要的相对路径,这取决于你的用例,例如,简单的代码<现在/代码>或者,如果你需要限制表达式的范围,损坏代码的范围,<代码>用户/现在< /代码>)< /p>从一个不改变任何东西的身份转换开始的可能副本。然后在那里添加新模板。另外,模板匹配可以是

而不是绝对路径表达式。为了进一步解释,这些缺失的标记不是空的,它们包含数据。正如您所看到的,从我发布的结果中,数据仍然存在,但是缺少封闭的标记。我需要将数据放回原始的封闭标记中。@MathiasMüller-我不知道你所说的“从一个不会改变任何东西的身份转换开始”是什么意思-我完全是XSLT的新手,并且试图通过必须这样做来学习。我已经调整了绝对路径,谢谢你。我爱你!完全修复,提供我所需要的(解释和解决方案)。非常感谢。是的,您还应该向OP指出,模板匹配为绝对路径表达式的样式表是不好的样式。请修改您的答案,明确说明
是模板的正确形式。我不会说“正确”或“错误样式”,但我完全同意将xpath表达式限制在用例中所需的范围内(OP仅显示了部分内容)。
<?xml version="1.0" encoding="UTF-8"?>



                <now xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:ms="urn:schemas-microsoft-com:xslt">17.11.2017</now>
                xyz.demo


                    app102.example.com
                    31632

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