如何使用转义标记(介于&;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

如何使用转义标记(介于&;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()函数重新加载它。通过使用,可以像加载外部文档一样加载嵌入数据,语法如下

我有一个具有上述结构的xml。实例节点在xml文件中重复多次。 我需要在此xml文件中进行两项更改:

如何使用XSLT将LayoutProperties中的第二列宽度从610更新到700?
如何使用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>
      &lt;AllItemsConfig&gt;
        &lt;ItemConfig&gt;
          &lt;ItemName&gt;ItemName1&lt;/ItemName&gt;
          &lt;Interval&gt;200&lt;/Interval&gt;
        &lt;/ItemConfig&gt;
        &lt;ItemConfig&gt;
          &lt;ItemName&gt;ItemName2&lt;/ItemName&gt;
          &lt;Interval&gt;500&lt;/Interval&gt;
        &lt;/ItemConfig&gt;
      &lt;/AllItemsConfig&gt;
    </ItemXmlAttributes>
  </Instance>
将字符串作为XML文档加载,该文档可以使用模板进行处理

此模板:

document('data:text/xml,<AllItemsConfig><ItemConfig> ... </ItemConfig></AllItemsConfig>')
此模板选择包含“ItemName1”的
ItemName
同级的
间隔
,并将内容更改为600。它只打印文本。无标签:

<xsl:template match="*[ancestor-or-self::AllItemsConfig]">
    <xsl:text>&lt;</xsl:text>
    <xsl:value-of select="name()"/>
    <xsl:text>&gt;</xsl:text>
        <xsl:apply-templates/>
    <xsl:text>&lt;/</xsl:text>
    <xsl:value-of select="name()"/>
    <xsl:text>&gt;</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">&lt;![CDATA[</xsl:text>
        <xsl:apply-templates select="document(concat('data:text/xml,',$input))/AllItemsConfig" />
        <xsl:text disable-output-escaping="yes">]]&gt;</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>&lt;</xsl:text>
    <xsl:value-of select="name()"/>
    <xsl:text>&gt;</xsl:text>
        <xsl:apply-templates/>
    <xsl:text>&lt;/</xsl:text>
    <xsl:value-of select="name()"/>
    <xsl:text>&gt;</xsl:text>
</xsl:template>
<xsl:template match="Interval[../ItemName='ItemName2']">
    <xsl:text>&lt;Interval&gt;</xsl:text>
    <xsl:text>600</xsl:text>
    <xsl:text>&lt;/Interval&gt;</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>&lt;</xsl:text>
        <xsl:value-of select="name()"/>
        <xsl:text>&gt;</xsl:text>
            <xsl:apply-templates/>
        <xsl:text>&lt;/</xsl:text>
        <xsl:value-of select="name()"/>
        <xsl:text>&gt;</xsl:text>
    </xsl:template>

    <xsl:template match="Interval[../ItemName='ItemName2']">
        <xsl:text>&lt;Interval&gt;</xsl:text>
        <xsl:text>600</xsl:text>
        <xsl:text>&lt;/Interval&gt;</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>&lt;AllItemsConfig&gt;
        &lt;ItemConfig&gt;
        &lt;ItemName&gt;ItemName1&lt;/ItemName&gt;
        &lt;Interval&gt;200&lt;/Interval&gt;
        &lt;/ItemConfig&gt;
        &lt;ItemConfig&gt;
        &lt;ItemName&gt;ItemName2&lt;/ItemName&gt;
        &lt;Interval&gt;600&lt;/Interval&gt;
        &lt;/ItemConfig&gt;
        &lt;/AllItemsConfig&gt;</ItemXmlAttributes>
</Instance>
<xsl:template match="ItemXmlAttributes">
    <xsl:variable name="input">
        <xsl:value-of select="."/>
    </xsl:variable>
    <xsl:copy>
        <xsl:text disable-output-escaping="yes">&lt;![CDATA[</xsl:text>
        <xsl:apply-templates select="document(concat('data:text/xml,',$input))/AllItemsConfig" />
        <xsl:text disable-output-escaping="yes">]]&gt;</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>