使用 xslt 操作 xml 文件中元素中的值

Manipulate values in element in xml file using xslt

提问人:patrick 提问时间:9/8/2023 更新时间:9/8/2023 访问量:35

问:

我希望能够删除或替换xml文件中元素中值中不必要的文本,并且我想使用XSLT转换来做到这一点。

在此示例文件中,我想删除特定标签,如 br、preffix、suffix、bulletlist 或将它们替换为 Value 元素值内的特定文本或简单字符。

将有许多产品元素。而且我不想改变这个文件的结构,所以这应该像复制一样,但有逻辑来删除特定的文本。

我尝试使用模板和复制,但不知何故我无法将它们连接在一起。

如果你们中的任何人可以帮助我或给我提示我应该遵循,我将不胜感激。

<ProductInfo>
  <Products>
    <Product>
     <Name>xyz</Name>
     <Values>
        <Value><br/>test</Value> <-- remove <br/>
        <Value><preffix>test2</preffix></Value> <-- replace <preffix> and </preffix> with " ." (white space and dot)
        <Value><suffix/>test3</Value> <-- remove <suffix/>
        <Value><list/><bulletlist>test4</bulletlist></Value> <-- replace <bulletlist> with "<ul>, </bulletlist> with </ul>"
     </Values>
    </Product>
  <Product>
     <Name>xyz</Name>
     <Values>
        <Value><br/>test</Value> <-- remove <br/>
        <Value><preffix>test2</preffix></Value> <-- replace <preffix> and </preffix> with " ." (white space and dot)
        <Value><suffix/>test3</Value> <-- remove <suffix/>
        <Value><list/><bulletlist>test4</bulletlist></Value> <-- replace <bulletlist> with "<ul>, </bulletlist> with </ul>"
     </Values>
    </Product>
  </Products>
</ProductInfo>

输出文件应如下所示:

<ProductInfo>
  <Products>
    <Product>
     <Name>xyz</Name>
     <Values>
        <Value>test</Value>
        <Value> .test2 .</Value>
        <Value>test3</Value>
        <Value><ul>test4</ul></Value>
     </Values>
    </Product>
  <Product>
     <Name>xyz</Name>
     <Values>
        <Value>test</Value>
        <Value> .test2 .</Value>
        <Value>test3</Value>
        <Value><ul>test4</ul></Value>
     </Values>
    </Product>
  </Products>
</ProductInfo>
xml xslt xslt-2.0

评论

0赞 michael.hor257k 9/8/2023
您的输出没有原始元素,尽管您的注释对此一无所知。--- 附言正确的拼写是 ,而不是 。<list/>prefixpreffix
0赞 Michael Kay 9/9/2023
如果你尽最大努力解决这个问题,而不是仅仅说你尝试了很多东西,这是很有用的。如果您尽最大努力,那么我们可以看到您哪里出了问题,并有针对性地做出回应,以帮助您克服学习障碍。从上下文来看,您的问题是 XSLT 文档处理的一个绝对标准示例,很难看出为什么您觉得它很困难。

答:

2赞 michael.hor257k 9/8/2023 #1

要获得您显示的结果,您需要执行以下操作:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

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

<!-- remove br, suffix, list altogether-->
<xsl:template match="br | suffix | list"/>

<!-- replace preffix tags with text, keep contents -->
<xsl:template match="preffix">
    <xsl:text> .</xsl:text>
    <xsl:apply-templates/>
    <xsl:text> .</xsl:text>
</xsl:template>

<!-- rename bulletlist -->
<xsl:template match="bulletlist">
    <ul>
        <xsl:apply-templates/>
    </ul>
</xsl:template>

</xsl:stylesheet>

请注意,这假设 和 (当然还有 ) 都是空的。如果此假设不正确,并且您希望保留其内容请将处理它们的模板更改为:suffixlistbr

<!-- remove br, suffix, list wrappers, keep contents -->
<xsl:template match="br | suffix | list">
    <xsl:apply-templates/>
</xsl:template>

评论

0赞 Siebe Jongebloed 9/8/2023
Note that this assumes that both suffix and list (and of course br) are empty.或者,如果它们不为空,则内容也将被跳过。:-)
1赞 michael.hor257k 9/8/2023
“他们的”,而不是“那里”。