Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
要使用XSLT格式化XML中包含混合内容的文本吗_Xslt_Xslt 2.0 - Fatal编程技术网

要使用XSLT格式化XML中包含混合内容的文本吗

要使用XSLT格式化XML中包含混合内容的文本吗,xslt,xslt-2.0,Xslt,Xslt 2.0,我想将下面的XML转换为指定的格式。我可以使用XSLT2.0实现这一点吗 基本上,我希望将文本放在一些元素中,并以特定的顺序排列新的文本元素和现有的子元素,这样我的xml序列化程序就可以将输出xml序列化为适当的类属性 输入XML: <properties> My Parent level text 1 <child1> text1 of first child <b> in bold</b> <childval>36-37&l

我想将下面的XML转换为指定的格式。我可以使用XSLT2.0实现这一点吗

基本上,我希望将文本放在一些元素中,并以特定的顺序排列新的文本元素和现有的子元素,这样我的xml序列化程序就可以将输出xml序列化为适当的类属性

输入XML:

<properties>
My Parent level text 1
<child1>  
text1 of first child <b> in bold</b>  
<childval>36-37</childval> 
text2 of child <i> in italic </i> 
</child1>
My Parent level text2 in <i>italic</i> also in <b>bold </b>
</properties>

我的父级文本1
第一个孩子的文本1以粗体显示
36-37 
斜体字的儿童文本2
我的父级文本2为斜体,也为粗体
预期输出XML:

<properties>
  <parenttext order="1">My Parent level text 1</parenttext>
  <child1 order="2">  
    <childtext childorder="1" > text1 of first child <b> in bold</b>     
    </childtext>
    <childval childorder="2">36-37</childval> 
    <childtext childorder="3" >text2 of child <i> in italic </i>  
    </childtext>
  </child1>
  <parenttext order="3">My Parent level text2 in <i>italic</i> also in <b>bold </b> 
  </parenttext>
</properties>

我的父级文本1
第一个孩子的文本1以粗体显示
36-37 
斜体字的儿童文本2
我的父级文本2为斜体,也为粗体

这是一个令人讨厌的源代码结构,如果可以的话,我会先对源代码进行更改

您可以尝试以下方法:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs" version="2.0">

<xsl:output indent="yes"/>

<xsl:variable name="inlineElements" select="'b','i'"/>

<xsl:template match="properties">
    <properties>
        <xsl:for-each-group select="node()" group-adjacent="self::text() or self::node()[name()=$inlineElements]">
            <xsl:choose>
                <xsl:when test="current-grouping-key()=true()">
                    <parenttext><xsl:copy-of select="current-group()"/></parenttext>
                </xsl:when>
                <xsl:otherwise>
                    <xsl:apply-templates select="."/>
                </xsl:otherwise>
            </xsl:choose>
        </xsl:for-each-group> 
    </properties>
</xsl:template>

<xsl:template match="child1">
    <xsl:element name="{name()}">
        <xsl:for-each-group select="node()" group-adjacent="self::text() or self::node()[name()=$inlineElements]">
            <xsl:choose>
                <xsl:when test="current-grouping-key()=true()">
                    <childtext><xsl:copy-of select="current-group()"/></childtext>
                </xsl:when>
                <xsl:otherwise>
                    <xsl:apply-templates select="."/>
                </xsl:otherwise>
            </xsl:choose>
        </xsl:for-each-group>
    </xsl:element>
</xsl:template>

<xsl:template match="childval">
    <xsl:copy>
        <xsl:value-of select="."/>
    </xsl:copy>
</xsl:template>
</xsl:stylesheet>

这将提供所需的输出减去订单属性

group INTERNATIONAL将检查所有节点,并将生成相同分组键的所有内容分组到一起,直到一个节点生成另一个分组键。所以文本和内联节点将生成true,直到一个子节点出现,这将生成false,依此类推


也可以在第二次转换中添加order属性,您可以使用:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:epub="hkda" exclude-result-prefixes="xs"
version="2.0">

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

<!-- match nodes which should have order nr -->
<xsl:template match="parrenttext | childtext | childval">
    <xsl:copy>
        <xsl:attribute name="orderno" select="position()"/>
        <xsl:apply-templates/>
    </xsl:copy>
</xsl:template>
</xsl:stylesheet>


输入结构有多少变化?也就是说,是否总是有2个“父级文本”和1个包含2个文本节点的子级文本?不完全是这样,数据是非常动态的。但是我想要的是获得一些技巧来按照文本和节点的顺序处理它们。为什么order=“3”的第二个
parenttext
元素是“?这没有意义。顺序是3,因为它位于properties元素的第三个位置。这是不需要存储的冗余信息。子元素的位置可以轻松检索。感谢您的回复。你能告诉我这是不是通用的吗。作为文本,我把只是一个样本文本,可能会有所不同。因此,有没有任何解决方案是没有问题的。因为您提供的当前xslt仅适用于此静态数据。如果需要,请纠正我。该文件只是出于演示目的,我将其从答案中删除。感谢您的快速响应。但是顺序属性呢?我们没有办法实现它吗?不确定这是怎么可能的,我可能只需要进行第二次转换,并用元素的位置添加order Attribute,这比我用第二个样式表编辑我的答案要简单得多,它将为您提供order nr。