如何使用转义标记(介于&;lt;和&;gt;之间)更新XSLT中的XML节点 出口按钮 100 1. 610 100 0 AllItemsConfig ItemConfig ItemName ItemName 1/ItemName 间隔200/间隔 /ItemConfig ItemConfig ItemName ItemName 2/ItemName 间隔500/间隔 /ItemConfig /AllItemsConfig
我有一个具有上述结构的xml。实例节点在xml文件中重复多次。 我需要在此xml文件中进行两项更改: 如何使用XSLT将LayoutProperties中的第二列宽度从610更新到700?如何使用转义标记(介于&;lt;和&;gt;之间)更新XSLT中的XML节点 出口按钮 100 1. 610 100 0 AllItemsConfig ItemConfig ItemName ItemName 1/ItemName 间隔200/间隔 /ItemConfig ItemConfig ItemName ItemName 2/ItemName 间隔500/间隔 /ItemConfig /AllItemsConfig,xslt,Xslt,我有一个具有上述结构的xml。实例节点在xml文件中重复多次。 我需要在此xml文件中进行两项更改: 如何使用XSLT将LayoutProperties中的第二列宽度从610更新到700? 如何使用XSLT将ItemXmlAttributes中ItemName2的间隔从500更新到600?我找到了一个使用XSLT 1.0和文本连接的解决方案,它允许您从转义的XML中提取数据。它涉及将文本存储到变量中,并使用document()函数重新加载它。通过使用,可以像加载外部文档一样加载嵌入数据,语法如下
如何使用XSLT将ItemXmlAttributes中ItemName2的间隔从500更新到600?我找到了一个使用XSLT 1.0和文本连接的解决方案,它允许您从转义的XML中提取数据。它涉及将文本存储到变量中,并使用
document()
函数重新加载它。通过使用,可以像加载外部文档一样加载嵌入数据,语法如下:
<Instance xsi:type="ButtonConfig">
<Name>ExitButton</Name>
<LayoutProperties xsi:type="Layout">
<Rows>
<Row>
<Height>100</Height>
</Row>
</Rows>
<Columns>
<Column>
<Width>1</Width>
</Column>
<Column>
<Width>610</Width>
</Column>
<Column>
<Width>100</Width>
</Column>
<Column>
<Width>0</Width>
</Column>
</Columns>
</LayoutProperties>
<ItemXmlAttributes>
<AllItemsConfig>
<ItemConfig>
<ItemName>ItemName1</ItemName>
<Interval>200</Interval>
</ItemConfig>
<ItemConfig>
<ItemName>ItemName2</ItemName>
<Interval>500</Interval>
</ItemConfig>
</AllItemsConfig>
</ItemXmlAttributes>
</Instance>
将字符串作为XML文档加载,该文档可以使用模板进行处理
此模板:
document('data:text/xml,<AllItemsConfig><ItemConfig> ... </ItemConfig></AllItemsConfig>')
此模板选择包含“ItemName1”的ItemName
同级的间隔
,并将内容更改为600。它只打印文本。无标签:
<xsl:template match="*[ancestor-or-self::AllItemsConfig]">
<xsl:text><</xsl:text>
<xsl:value-of select="name()"/>
<xsl:text>></xsl:text>
<xsl:apply-templates/>
<xsl:text></</xsl:text>
<xsl:value-of select="name()"/>
<xsl:text>></xsl:text>
</xsl:template>
它将生成
元素,如下所示:
<xsl:template match="ItemXmlAttributes">
<xsl:variable name="input">
<xsl:value-of select="."/>
</xsl:variable>
<xsl:copy>
<xsl:text disable-output-escaping="yes"><![CDATA[</xsl:text>
<xsl:apply-templates select="document(concat('data:text/xml,',$input))/AllItemsConfig" />
<xsl:text disable-output-escaping="yes">]]></xsl:text>
</xsl:copy>
</xsl:template>
<xsl:template match="Interval[../ItemName='ItemName2']">
<xsl:copy>600</xsl:copy>
</xsl:template>
项目名称1
200
项目名称2
600
]]>
哪个(在XPath数据模型中)与带有转义标记的相同。XSLT的哪个版本?可以是XSLT2.0吗?“如何将间隔从500更新到600”不容易;看看这里给出的答案,这是一个很好的例子,说明你为什么不应该这样做“不要试图将XML结构化内容表示为文本。如果它是实际的XML,它将与文档的其余部分一起解析,XML工具将能够轻松地处理它。试一试。我实际上并不知道data:URI模式与Saxon一起工作:谢谢你提供的信息。它只有在XML解析器能够识别它的情况下才能工作,因此作为参考,它可能会根据您在Saxon中使用的XML解析器而有所不同。它在我的命令行环境(由OxygenXML包配置)中工作,但在任何在线服务上都不工作,也没有使用带有默认解析器的Java8TraxAPI。我现在试图发现为什么它在其中一个中工作而在另一个中不工作(因为我认为它们都使用同一个解析器)。也许Oxy提供了自己的URIResolver,它定制了传递给document()函数的URI的解析方式,所以它提供了魔力,而不是Saxon或XML解析器。
<xsl:template match="ItemXmlAttributes">
<xsl:variable name="input">
<xsl:value-of select="."/>
</xsl:variable>
<xsl:copy>
<xsl:apply-templates
select="document(concat('data:text/xml,',$input))/AllItemsConfig" />
</xsl:copy>
</xsl:template>
<xsl:template match="*[ancestor-or-self::AllItemsConfig]">
<xsl:text><</xsl:text>
<xsl:value-of select="name()"/>
<xsl:text>></xsl:text>
<xsl:apply-templates/>
<xsl:text></</xsl:text>
<xsl:value-of select="name()"/>
<xsl:text>></xsl:text>
</xsl:template>
<xsl:template match="Interval[../ItemName='ItemName2']">
<xsl:text><Interval></xsl:text>
<xsl:text>600</xsl:text>
<xsl:text></Interval></xsl:text>
</xsl:template>
<xsl:template match="Column[2]">
<xsl:copy>700</xsl:copy>
</xsl:template>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:preserve-space elements="Interval ItemName ItemConfig AllItemsConfig"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="Column[2]">
<xsl:copy>700</xsl:copy>
</xsl:template>
<xsl:template match="ItemXmlAttributes">
<xsl:variable name="input">
<xsl:value-of select="."/>
</xsl:variable>
<xsl:copy>
<xsl:apply-templates
select="document(concat('data:text/xml,',$input))/AllItemsConfig" />
</xsl:copy>
</xsl:template>
<xsl:template match="*[ancestor-or-self::AllItemsConfig]">
<xsl:text><</xsl:text>
<xsl:value-of select="name()"/>
<xsl:text>></xsl:text>
<xsl:apply-templates/>
<xsl:text></</xsl:text>
<xsl:value-of select="name()"/>
<xsl:text>></xsl:text>
</xsl:template>
<xsl:template match="Interval[../ItemName='ItemName2']">
<xsl:text><Interval></xsl:text>
<xsl:text>600</xsl:text>
<xsl:text></Interval></xsl:text>
</xsl:template>
</xsl:stylesheet>
<Instance xmlns:xsi="ns1" xsi:type="ButtonConfig">
<Name>ExitButton</Name>
<LayoutProperties xsi:type="Layout">
<Rows>
<Row>
<Height>100</Height>
</Row>
</Rows>
<Columns>
<Column>
<Width>1</Width>
</Column>
<Column>700</Column>
<Column>
<Width>100</Width>
</Column>
<Column>
<Width>0</Width>
</Column>
</Columns>
</LayoutProperties>
<ItemXmlAttributes><AllItemsConfig>
<ItemConfig>
<ItemName>ItemName1</ItemName>
<Interval>200</Interval>
</ItemConfig>
<ItemConfig>
<ItemName>ItemName2</ItemName>
<Interval>600</Interval>
</ItemConfig>
</AllItemsConfig></ItemXmlAttributes>
</Instance>
<xsl:template match="ItemXmlAttributes">
<xsl:variable name="input">
<xsl:value-of select="."/>
</xsl:variable>
<xsl:copy>
<xsl:text disable-output-escaping="yes"><![CDATA[</xsl:text>
<xsl:apply-templates select="document(concat('data:text/xml,',$input))/AllItemsConfig" />
<xsl:text disable-output-escaping="yes">]]></xsl:text>
</xsl:copy>
</xsl:template>
<xsl:template match="Interval[../ItemName='ItemName2']">
<xsl:copy>600</xsl:copy>
</xsl:template>
<ItemXmlAttributes>
<![CDATA[<AllItemsConfig>
<ItemConfig>
<ItemName>ItemName1</ItemName>
<Interval>200</Interval>
</ItemConfig>
<ItemConfig>
<ItemName>ItemName2</ItemName>
<Interval>600</Interval>
</ItemConfig>
</AllItemsConfig>]]>
</ItemXmlAttributes>