XSL以获得与XML元素中完全相同的html代码

XSL以获得与XML元素中完全相同的html代码,xml,xslt,Xml,Xslt,这里是XML/XSL新手,请原谅我的无知。这是给我的xml输入: <entry> <desc> <p>Lorem ipsum <a href="http://www.google.com">dolor</a> sit amet.</p> <p>Lorem <strong>ipsum</strong> dolor sit amet.</p>

这里是XML/XSL新手,请原谅我的无知。这是给我的xml输入:

<entry>
    <desc>
        <p>Lorem ipsum <a href="http://www.google.com">dolor</a> sit amet.</p>
        <p>Lorem <strong>ipsum</strong> dolor sit amet.</p>
    </desc>
</entry>
我假设我的系统上一定有其他xsl样式表可以这样做,对吗?在任何情况下,我都没有对它们进行读取和编辑访问,我只能添加一个新的样式表,因此为了解决这个问题,我使用了以下方法:

<xsl:for-each select="desc/*">
    <p><xsl:value-of select="."/></p>
</xsl:for-each>

这至少让我明白:

<p>Lorem ipsum dolor sit amet.</p><p>Lorem ipsum dolor sit amet.</p>
Lorem ipsum door sit amet.

Lorem ipsum door sit amet


然而,正如你所看到的,链接和格式已经消失了,再见!我无法控制添加到其中的html元素的种类。有人能建议一种保存格式和所有desc元素的方法吗?该引擎仅为XSL 1。提前谢谢

您需要复制
desc
下的元素及其所有子元素。XSL元素将为您执行以下操作:

<xsl:copy-of select="desc/node()"/>


这将复制
desc
的所有子元素,包括文本节点及其任何子元素。

您需要复制
desc
下的元素及其所有子元素。XSL元素将为您执行以下操作:

<xsl:copy-of select="desc/node()"/>

这将复制
desc
的所有子元素,包括文本节点及其任何子元素。

请尝试以下操作:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="/entry/desc">
        <xsl:copy-of select="@*|node()"/>
    </xsl:template>
</xsl:stylesheet>

试试这个:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="/entry/desc">
        <xsl:copy-of select="@*|node()"/>
    </xsl:template>
</xsl:stylesheet>

您的选择不正确

选择=“desc”

选择=“/entry/desc”

发件人:

nodename选择命名节点的所有子节点

/从根节点中选择

//从当前节点中选择文档中与选择号匹配的节点 不管他们在哪里

。选择当前节点

。。选择当前节点的父节点


@选择属性

您的选择不正确

选择=“desc”

选择=“/entry/desc”

发件人:

nodename选择命名节点的所有子节点

/从根节点中选择

//从当前节点中选择文档中与选择号匹配的节点 不管他们在哪里

。选择当前节点

。。选择当前节点的父节点


@选择属性,除非您确定
只包含元素(没有混合内容),否则我建议使用
“desc/node()”
,它将同时抓取元素和文本节点。@Ben Blank:示例中只有元素,但您的观点是有效的。我将把它添加到我的答案中。谢谢!我明天会在工作中尝试,看看它是否提供了所需的输出。我要补充的是,这是正确答案的原因是xsl:value of将返回所有子节点的文本值,这就是为什么您只获得Lorem Ipsum而没有标记的原因。xsl:copy of将复制节点及其文本。谢谢各位,今天才有时间尝试,效果非常好!也非常感谢单簧管的解释,这很有道理!除非您确定
只包含元素(没有混合内容),否则我建议改用
的“desc/node()”
,它将同时抓取元素和文本节点。@Ben Blank:示例中只有元素,但您的观点是有效的。我将把它添加到我的答案中。谢谢!我明天会在工作中尝试,看看它是否提供了所需的输出。我要补充的是,这是正确答案的原因是xsl:value of将返回所有子节点的文本值,这就是为什么您只获得Lorem Ipsum而没有标记的原因。xsl:copy of将复制节点及其文本。谢谢各位,今天才有时间尝试,效果非常好!也非常感谢单簧管的解释,这很有道理!他的选择器显然是对的,否则他将根本得不到输出。更可能的是,他只是为每个或
模板
声明省略了
,这些声明为他的代码片段建立了上下文。为了简洁起见,我省略了“entry”模板声明,但我的select确实获得了desc元素的值,由于我不知道的原因,他删除了所有的格式。他的选择器显然是正确的,否则他将无法得到任何输出。更可能的是,他只是为每个
模板
声明省略了
,这些声明为他的代码片段建立了上下文。为了简洁起见,我省略了“entry”模板声明,但我的select确实获得了desc元素的值,由于我不知道的原因,我刚刚删除了所有的格式。我已经在一个模板中了,为了简洁起见,我省略了这个模板。select的@*|node()部分在这样的模板中工作吗?我承认我对它的含义感到困惑。我已经在一个模板中,为了简洁起见,我省略了这个模板。select的@*|node()部分在这样的模板中工作吗?我承认我不知道这意味着什么。
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="/entry/desc">
        <xsl:copy-of select="@*|node()"/>
    </xsl:template>
</xsl:stylesheet>